1

根据C# 参考

“null 关键字是表示空引用的文字,它不引用任何对象。null 是引用类型变量的默认值”

我惊讶地发现以下应用程序代码中的
Commentinge=null行(取自文章“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();
  }
}

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

他们可能应该有不同的类型,用于检查:
if typeof(unassigned-null) then do this;
如果 typeof(assigned_null) 则执行此操作;

4

4 回答 4

2

局部变量不使用它们的默认值初始化,而字段是。

于 2013-02-14T13:40:08.363 回答
1

要回答您的问题:

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

答:它用于将它传递给 MyEvent(sender, e );

  • 问题:是否可以强制应用程序在没有哑巴将变量分配为 null 的情况下运行?

回答:不,这并不愚蠢,因为您通过将e传递给另一个方法来使用它。您只是没有直接使用它 - 但您仍在使用它。

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

MyEvent(sender, null);

然后你不需要做任何多余的变量声明。

于 2013-02-14T13:46:58.910 回答
1

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

如果你想通过null,为什么要介绍e呢?只要有

MyEvent(sender, null);

这至少使您的意图明确。

于 2013-02-14T13:48:24.697 回答
1

您正在使用e而没有为其分配值。使用e = null;,您正在为变量 e 赋值,因为null 也是一个值

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

于 2013-02-14T13:54:55.883 回答