委托创建语法的差异

avo*_*avo 0 .net c# 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));
Run Code Online (Sandbox Code Playgroud)

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

p.s*_*w.g 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     
Run Code Online (Sandbox Code Playgroud)

然而,还有第四个语法不同的:

Action<string> alert = MessageBox.Show;
Run Code Online (Sandbox Code Playgroud)

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

IL_0000:  ldnull      
IL_0001:  ldftn       System.Console.WriteLine
IL_0007:  newobj      System.Action<System.String>..ctor
Run Code Online (Sandbox Code Playgroud)