c# - 以下注册事件的方式有区别吗

标签 c# .net c#-3.0

我想报名参加一些事件。以下方式有效:

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

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

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

最佳答案

相同 - 没有差异。编译器推断委托(delegate)的类型并自动为您神奇地完成。语法糖让你的生活更轻松

刚刚深入了解了 C#。此功能称为“方法组转换”;在 C#2.0 中添加

例如出自书本

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
}

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

    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 

关于c# - 以下注册事件的方式有区别吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1260669/

相关文章:

c# - 简单地检查多个语句 C#

c# - 温莎伐木设施 : Control log name

c# - 自动将所有控件属性从 resx 文件移动到 Designer.cs 代码文件

.net - 为什么.net 4.0和.net 2.0 CLR可以存在于同一台机器上

c# - 如何作为委托(delegate)传递属性?

c# - 一种存储信息的方法

c# - 为什么在 .NET 生态系统的标准事件模式中没有将 TEventArgs 设为逆变?

.NET 相当于 httpunit

asp.net - 防止 anchor 标记点击刷新

c# - 连接 2 个表的测试记录