Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以下注册到事件的方法之间是否存在差异_C#_.net_C# 3.0 - Fatal编程技术网

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+编译器现在足够聪明,可以将方法/方法组转换为正确类型的委托