lambda表达式与方法组之间的区别

有什么区别

Class1.Method1("cId", Facade.Customers.GetSingle); 

 Class1.Method1("cId", x => Facade.Customers.GetSingle(x)); 

Resharper建议使用第一个表达式。

结果没有区别。 但是,第二个创建了一个额外的重定向:代码将首先调用您的匿名方法,获取一个名为x参数,然后使用该参数调用Facade.Customers.GetSingle 。 这种重定向根本没有任何好处,这就是ReSharper告诉您使用第一种替代方案的原因。

在幕后,如果使用lambda表达式,编译器会生成更多代码。 使用方法组,它只是创建一个指向该方法的新委托:

 L_0001: ldstr "cId" L_0006: ldnull L_0007: ldftn void Facade/Customers::GetSingle(valuetype [mscorlib]System.Guid) L_000d: newobj instance void [mscorlib]System.Action`1::.ctor(object, native int) L_0012: call void Class1::Method1(string, class [mscorlib]System.Action`1) 

使用lambda表达式,在类上创建一个匿名方法( b__0上的b__0 b__0),委托引用它:

 L_0018: ldstr "cId" L_001d: ldsfld class [mscorlib]System.Action`1 Class1::CS$<>9__CachedAnonymousMethodDelegate1 L_0022: brtrue.s L_0037 L_0024: ldnull L_0025: ldftn void Class1::b__0(valuetype [mscorlib]System.Guid) L_002b: newobj instance void [mscorlib]System.Action`1::.ctor(object, native int) L_0030: stsfld class [mscorlib]System.Action`1 Class1::CS$<>9__CachedAnonymousMethodDelegate1 L_0035: br.s L_0037 L_0037: ldsfld class [mscorlib]System.Action`1 Class1::CS$<>9__CachedAnonymousMethodDelegate1 L_003c: call void Class1::Method1(string, class [mscorlib]System.Action`1) 

您的Method1接受Func参数的地方, Func是以下内容的同义词:

 public delegate BECustomer Func(Guid arg); 

实际上,所有Func都是一个通用委托:

 public delegate TResult Func(T arg); 

编译器可以分析您的代码并确定您的FuncFacade.Customers.GetSingle的方法组兼容,因为方法签名与委托签名匹配。

这是语法糖,是编译器为你做咕噜声工作的另一个例子。