注册事件的方法有以下几点吗?

时间:2009-08-11 14:18:36

标签: c# .net c#-3.0

我想注册一些活动。以下方式有效:

public void AddOptionAsListner(OptionElement option)
    {
        option.Selected += onOptionSelectedChanged;
    }

public void AddOptionAsListner(OptionElement option)
    {
        option.Selected += new EventHandler(onOptionSelectedChanged);
    }

是否存在差异,或者这只是同一事物的不同语法?

3 个答案:

答案 0 :(得分:9)

相同 - 没有差异。编译器推断出委托的类型,并为您自动神奇地执行。语法糖使你的生活更轻松

刚刚用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
}

如果我在反射器中打开它,你会看到编译器刚刚在幕后为你创建了正确类型的委托实例。

    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 

答案 1 :(得分:3)

同样的事情,新的EventHandler()只是多余的。

您无需为事件处理程序显式创建委托。

答案 2 :(得分:0)

就运行时而言,没有区别。编译器将它们视为略微不同,因为它必须根据事件本身的签名推断委托的签名(您的事件处理方法),而在第二个中它告诉签名应该是什么

如果您在订阅活动时使用“自动”(即“标签,标签”序列),则第二个签名是由Visual Studio自动生成的签名。