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#编译器生成的代码的角度来看,它们之间有什么区别吗?或者只是品味问题?
不,没有区别.在所有三种情况下产生的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)