繁体   English   中英

lambda 表达式与方法组之间的差异

[英]Difference between lambda expression and method group

有什么区别

Class1.Method1<Guid, BECustomer>("cId", Facade.Customers.GetSingle);

Class1.Method1<Guid, BECustomer>("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<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>)

使用 lambda 表达式,在 class (L_0025 上的<Test>b__0 )上创建一个匿名方法,并且委托引用它:

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>)

如果您的Method1<Guid, BECustomer>接受Func<Guid, BECustomer>参数,则Func<Guid, BECustomer>与:

public delegate BECustomer Func(Guid arg);

事实上,一个Func就是一个泛型委托:

public delegate TResult Func<T, TResult>(T arg);

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

这是语法糖,是编译器为您完成繁重工作的另一个示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM