Ale*_*dre 16 c# lambda method-group
有什么区别
Class1.Method1<Guid, BECustomer>("cId", Facade.Customers.GetSingle);
Run Code Online (Sandbox Code Playgroud)
和
Class1.Method1<Guid, BECustomer>("cId", x => Facade.Customers.GetSingle(x));
Run Code Online (Sandbox Code Playgroud)
?
Resharper建议使用第一个表达式.
Dan*_*rth 20
结果没有区别.但是,第二个创建了一个额外的重定向:代码将首先调用您的匿名方法,获取一个名为的参数x
,然后Facade.Customers.GetSingle
使用该参数调用.这种重定向根本没有任何好处,这就是ReSharper告诉您使用第一种替代方案的原因.
dah*_*byk 13
在幕后,如果使用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<valuetype [mscorlib]System.Guid>::.ctor(object, native int)
L_0012: call void Class1::Method1<valuetype [mscorlib]System.Guid, class BECustomer>(string, class [mscorlib]System.Action`1<!!0>)
Run Code Online (Sandbox Code Playgroud)
使用lambda表达式,在类<Test>b__0
上创建一个匿名方法(在L_0025上),代理引用它:
L_0018: ldstr "cId"
L_001d: ldsfld class [mscorlib]System.Action`1<valuetype [mscorlib]System.Guid> Class1::CS$<>9__CachedAnonymousMethodDelegate1
L_0022: brtrue.s L_0037
L_0024: ldnull
L_0025: ldftn void Class1::<Test>b__0(valuetype [mscorlib]System.Guid)
L_002b: newobj instance void [mscorlib]System.Action`1<valuetype [mscorlib]System.Guid>::.ctor(object, native int)
L_0030: stsfld class [mscorlib]System.Action`1<valuetype [mscorlib]System.Guid> Class1::CS$<>9__CachedAnonymousMethodDelegate1
L_0035: br.s L_0037
L_0037: ldsfld class [mscorlib]System.Action`1<valuetype [mscorlib]System.Guid> Class1::CS$<>9__CachedAnonymousMethodDelegate1
L_003c: call void Class1::Method1<valuetype [mscorlib]System.Guid, class BECustomer>(string, class [mscorlib]System.Action`1<!!0>)
Run Code Online (Sandbox Code Playgroud)