将重复的lambda表达式解析为相同的生成代码吗?

时间:2009-06-18 01:17:44

标签: .net generics

这是一个简单的问题。如果同一个类中两个lambda表达式的内容完全相同,编译器是否会生成并使用一个backer方法,还是会为每个实例生成一个方法?

示例

ctl.MouseOver += (sender,e) => UpdateStatus();
ctl.MouseOut += (sender,e) => UpdateStatus();

这会产生一个或两个支持者方法吗?

P.S。我知道您可以创建另一个方法HandleUpdate(object,EventArgs)并将事件附加到该方法。但我对编译器实际发生的事情更加好奇。

3 个答案:

答案 0 :(得分:2)

这很复杂。 IIRC(我可能离开这里,已经有一段时间了,因为我已经阅读了确切的细节),两个表达式可以“解析”到同一个实例,但实际上这很难做到,因为表达式倾向于创建略有不同的闭包,需要用表达式提升。基本上,呼叫站点也很重要。

答案 1 :(得分:1)

根据我的经验,它会生成两份副本。可能有一些我没有打过的优化,但每次检查我的代码时,我都会得到两份。

如果您要重复处理,我建议您创建一个HandleUpdate方法,如上所述。

答案 2 :(得分:1)

将lambda表达式放在同一个类中并不足以将表达式视为相同,因为编译器会考虑它们在其中调用的方法。

在同一个方法中使用相同的表达式两次,你可能会获得相同的实例,但我不会编写依赖于此行为的代码。

如果您确实需要了解编译器的当前行为,请获取reflector的副本并查看生成的IL。