创建委托实例的两种不同方法?

时间:2017-03-31 02:17:42

标签: c#

using System; 

delegate void D(int x); 

class C 
{ 
   public static void M1(int i) { 
    Console.WriteLine("C.M1: " + i); 
   } 
}

  D cd1 = new D(C.M1);
  D cd2 = C.M1;

委托实例cd1cd2的创建方式与上述不同。

他们是等同的吗?

如果没有,他们之间有什么区别?

感谢。

2 个答案:

答案 0 :(得分:4)

如果你看看通过像LinqPad这样的工具生成的IL,你会发现在这种情况下两个块都编译成完全相同的东西:

void Main()
{
    D cd1 = new D(C.M1);
    D cd2 = C.M1;
}

变为

IL_0000:  nop         
IL_0001:  ldnull      
IL_0002:  ldftn       UserQuery+C.M1
IL_0008:  newobj      UserQuery+D..ctor
IL_000D:  stloc.0     // cd1
IL_000E:  ldnull      
IL_000F:  ldftn       UserQuery+C.M1
IL_0015:  newobj      UserQuery+D..ctor
IL_001A:  stloc.1     // cd2
IL_001B:  ret  

请注意,指令2-5在6-9中重复,并且在创建新实例后使用不同的stloc。

答案 1 :(得分:4)

  

他们是等同的吗?

是。明确创建的代理和使用Method Group Syntax创建的代理彼此相同。

方法组转换已在C#2.0中引入。在C#的第一个版本中,您用于cd1的语法是创建委托的唯一选择。