我可以使用以下任何一种方法:
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#编译器生成的代码的角度来看,它们之间有什么区别吗?或者仅仅是品味问题?
答案 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