调用/创建委托

时间:2013-09-06 01:01:10

标签: c# syntax delegates

每个人的好日子,

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

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();
    } 

2 个答案:

答案 0 :(得分:3)

它们是相同的 - 第二个是Syntactic Sugar。为了确认我查看了为两者生成的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:

答案 1 :(得分:1)

他们是一样的。创建语法糖是为了避免写这个:

   button1.Click -= new EventHandler(button1_Click);

这大大困扰了新的C#程序员。如:“什么?我必须创建一个新的委托对象删除它???”。是的,你这样做。

没有人抱怨:

   button1.Click -= button1_Click;