委托创建语法的差异

时间:2013-12-05 04:21:16

标签: c# .net syntax lambda delegates

我可以使用以下任何一种方法:

var alert = new Action<string>((s) => MessageBox.Show(s));

// Or

Action<string> alert = (s) => MessageBox.Show(s);

// Or

Action<string> alert = new Action<string>((s) => MessageBox.Show(s));

从C#编译器生成的代码的角度来看,它们之间有什么区别吗?或者仅仅是品味问题?

1 个答案:

答案 0 :(得分:5)

不,没有区别。在所有三种情况下产生的IL是相同的。如果你很好奇,这就是LINQPad生成的内容(使用Console.WriteLine作为MessageBox.Show的替代):

IL_0000:  ldsfld      UserQuery.CS$<>9__CachedAnonymousMethodDelegate1
IL_0005:  brtrue.s    IL_0018
IL_0007:  ldnull      
IL_0008:  ldftn       b__0
IL_000E:  newobj      System.Action<System.String>..ctor
IL_0013:  stsfld      UserQuery.CS$<>9__CachedAnonymousMethodDelegate1
IL_0018:  ldsfld      UserQuery.CS$<>9__CachedAnonymousMethodDelegate1

b__0:
IL_0000:  ldarg.0     
IL_0001:  call        System.Console.WriteLine
IL_0006:  ret     

但是, 的第四种语法不同:

Action<string> alert = MessageBox.Show;

前面的示例都是通过生成匿名方法并绑定到它来创建委托。这种新语法将委托直接绑定到原始方法。在这种情况下生成的IL是:

IL_0000:  ldnull      
IL_0001:  ldftn       System.Console.WriteLine
IL_0007:  newobj      System.Action<System.String>..ctor