调用/创建委托

本文关键字:创建 调用 | 更新日期: 2023-09-27 18:30:17

大家好,

我注意到有两种方法可以调用/创建委托

MrDel MyDelegate = new MrDel(Mathmetics.Method);

MrDel MyDelegate = Mathmetics.Method;

所以我的问题是这两种方式有什么区别?如果第二个打字时间短得多,并且它们似乎在做同样的事情,为什么我需要使用第一个?通过浏览一些教程,我看到ppl使用第一种方式或第二种方式,但它们并没有真正解释原因。你能帮我说清楚或指出我可以在哪里阅读它,谢谢。

完整代码:

class Program
{
    public delegate void MrDel(int arg, ThingsToDo e);
    static void Main(string[] args)
    {
        MrDel MyDelegate = new MrDel(Mathmetics.Method);
        //MrDel MyDelegate = Mathmetics.Method;

        Method(MyDelegate);
        Console.Read();
    } 

调用/创建委托

它们是相同的 - 第二个是第一个的句法糖。 为了确认,我查看了为两者生成的 IL,它们是相同的:

IL_0001:  ldarg.0     
IL_0002:  ldftn       UserQuery.Method
IL_0008:  newobj      UserQuery+MrDel..ctor
IL_000D:  stloc.0     // MyDelegate
Method:
IL_0000:  nop         
IL_0001:  ret         
MrDel.Invoke:
MrDel.BeginInvoke:
MrDel.EndInvoke:
MrDel..ctor:

它们是相同的。 创建语法糖是为了避免必须编写以下内容:

   button1.Click -= new EventHandler(button1_Click);

这极大地困扰了新的C#程序员。 如:"什么?? 我必须创建一个新的委托对象才能删除它???"。 是的,你愿意。

没有人抱怨:

   button1.Click -= button1_Click;