为什么未使用事件参数需要赋值

时间:2013-02-14 13:38:09

标签: c# events delegates event-handling arguments

根据C# Reference

  

“null关键字是表示空引用的文字,一个   这并不是指任何对象。 null是默认值   引用类型变量'

我很惊讶地发现了这一点 在以下应用代码中评论e=null行(取自文章"Difference Between Events And Delegates in C#")会导致编译错误:

Use of unassigned local variable 'e'

虽然没有评论,但它被编译并运行。

我没有得到:

  • 变量e在哪里使用?
  • 是否可以强制应用运行而不会将变量分配给null

f

using System;   
class Program   
{   
  static void Main(string[] args)   
  {   
    DelegatesAndEvents obj = new DelegatesAndEvents();   
    obj.Execute();  
  }  
}  
public class DelegatesAndEvents  
{
  public event EventHandler MyEvent;
  internal void Execute()
  {
    EventArgs e;
//Commenting the next line results in compilation error
//Error 1   Use of unassigned local variable 'e'
    e = null;
    int sender = 15;
    MyEvent += MyMethod;
    MyEvent += MyMethod2;
    MyEvent(sender, e);
  }
  void MyMethod(object sender, EventArgs e)
  {
    Console.WriteLine(sender);
  }
  void MyMethod2(object sender, EventArgs e)
  {
    Console.WriteLine(sender);
    Console.ReadLine();
  }
}

更新(或对所有答案的评论):
所以,我从来不知道它,有一些空值 - 一个是分配的,另一个是未分配的...搞笑......

它们应该有不同的类型,用于检查:
如果是typeof(unassigned-null)则执行此操作;
如果typeof(assigned_null)那么那样做;

4 个答案:

答案 0 :(得分:2)

本地变量未使用其默认值进行初始化,而字段为。

答案 1 :(得分:1)

回答你的问题:

  • 问题:变量e在哪里使用?

答案:用于将其传递给MyEvent的地方(发件人, e );

  • 问题:是否可以强制应用程序运行而不会将变量赋值为null?

答案:不,并且它并不愚蠢,因为您使用 e 将其传递给另一种方法。你只是没有直接使用它 - 但你还在使用它。

实际上,您无需在任何地方声明 e - 您只需将null直接传递给MyEvent:

MyEvent(sender, null);

然后您不需要做任何冗余变量声明。

答案 2 :(得分:1)

在编译Execute时,编译器无法知道哪些事件处理程序已注册到MyEvent。 (其他人可能在调用Execute之前已经注册,他们可能会尝试使用e)。因此,它不会尝试对可能知道的任何处理程序进行任何分析。因此,既然您想要传递e,则必须对其进行初始化。

如果您想通过null,为什么要介绍e?只是

MyEvent(sender, null);

至少使你的意图明确。

答案 3 :(得分:1)

您正在使用e而未为其指定值。使用e = null;,您将值赋值给变量e,因为 null也是值

此外,根据C#引用,引用类型的默认值为null,但此处e是一个变量。变量不是默认的,在使用之前必须有“明确的赋值”。