C# 调用/创建委托

C# 调用/创建委托,c#,syntax,delegates,C#,Syntax,Delegates,大家好, 我注意到有两种方法可以调用/创建委托 MrDel MyDelegate=新的MrDel(Mathmetics.Method) 或 MrDel MyDelegate=Mathmetics.Method 所以我的问题是这两种方式有什么区别?为什么我需要使用第一个,如果第二个是短得多的类型,他们似乎做同样的事情?通过阅读一些教程,我看到ppl使用第一种方式或第二种方式,但它们并没有真正解释原因。你能帮我弄清楚或者指出我在哪里可以读到它吗,谢谢 完整代码: class Program {

大家好,

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

MrDel MyDelegate=新的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:

它们是一样的——第二个是第一个。为了确认这一点,我查看了为两者生成的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:

它们是一样的。创建语法sugar是为了避免编写以下内容:

   button1.Click -= new EventHandler(button1_Click);
这大大困扰了新的C#程序员。例如:“什么?我必须创建一个新的委托对象以删除它?”。是的,你知道

没有人抱怨:

   button1.Click -= button1_Click;

它们是一样的。创建语法sugar是为了避免编写以下内容:

   button1.Click -= new EventHandler(button1_Click);
这大大困扰了新的C#程序员。例如:“什么?我必须创建一个新的委托对象以删除它?”。是的,你知道

没有人抱怨:

   button1.Click -= button1_Click;

非常感谢。你已经向IL指出了这一点,这很好——一开始就应该用它来检查引擎盖下面!:谢谢你!你已经向IL指出了这一点,这很好——一开始就应该用它来检查引擎盖下面!:D