“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)那么那样做;
答案 0 :(得分:2)
本地变量未使用其默认值进行初始化,而字段为。
答案 1 :(得分:1)
回答你的问题:
答案:用于将其传递给MyEvent的地方(发件人, e );
答案:不,并且它并不愚蠢,因为您使用 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
是一个变量。变量不是默认的,在使用之前必须有“明确的赋值”。