C# 以下注册到事件的方法之间是否存在差异
我想报名参加一些活动。以下方法有效:C# 以下注册到事件的方法之间是否存在差异,c#,.net,c#-3.0,C#,.net,C# 3.0,我想报名参加一些活动。以下方法有效: public void AddOptionAsListner(OptionElement option) { option.Selected += onOptionSelectedChanged; } public void AddOptionAsListner(OptionElement option) { option.Selected += new EventHandler(onOptionSe
public void AddOptionAsListner(OptionElement option)
{
option.Selected += onOptionSelectedChanged;
}
public void AddOptionAsListner(OptionElement option)
{
option.Selected += new EventHandler(onOptionSelectedChanged);
}
是有区别还是这只是同一事物的不同语法?这是同一事物,新的EventHandler()只是多余的
您不需要为事件处理程序显式创建委托。相同-无差异。编译器会推断委托的类型,并自动为您执行该操作。让你的生活更轻松一点 刚刚与C#进行了深入检查。此功能称为“方法组转换””;在C#2.0中添加 e、 g.从书中
static void MyMethod() { ... }
static void MyMethod( object sender, EventArgs e) {...}
static void Main() {
ThreadStart x = MyMethod; // binds to first overload
EventHandler y = MyMethod; // binds to second overload
}
如果我在reflector中打开它,您会看到编译器只是在幕后为您创建了正确类型的委托实例
L_0000: ldnull
L_0001: ldftn void CS.Temp.Program::MyMethod()
L_0007: newobj instance void [mscorlib]System.Threading.ThreadStart::.ctor(object, native int)
L_000c: pop
L_000d: ldnull
L_000e: ldftn void CS.Temp.Program::MyMethod(object, class [mscorlib]System.EventArgs)
L_0014: newobj instance void [mscorlib]System.EventHandler::.ctor(object, native int)
L_0019: pop
就运行时而言,没有区别。编译器认为它们稍有不同,因为它必须根据事件本身的签名推断委托的签名(您的事件处理方法),而在第二个过程中,它被告知签名应该是什么
如果在订阅事件时使用“自动”(即“tab,tab”序列),则Visual Studio会自动为您生成第二个签名。没有区别。我的0.02c,当您注销事件时也是如此。@Mehrdad-您至少可以体面地提供到事件的链接duplicate@Elad当前位置实际上我试图找到它,但没有成功。这里是:好的,谢谢你的链接。我认为这里提供的答案更为详细。否则我会删除这个问题。小的区别是第一个问题不会在c#1.0中编译。这一点很好,但由于问题被标记为c#3.0,我不想提及它。如果我的记忆足够的话,后者是1.1中需要的旧sintax。或者可能是2.0。但是现在编译器自己完成了这个任务。你说得对。。正在检查参考书:)2.0+编译器现在足够聪明,可以将方法/方法组转换为正确类型的委托