这是一个简单的问题。如果同一个类中两个lambda表达式的内容完全相同,编译器是否会生成并使用一个backer方法,还是会为每个实例生成一个方法?
示例
ctl.MouseOver += (sender,e) => UpdateStatus();
ctl.MouseOut += (sender,e) => UpdateStatus();
这会产生一个或两个支持者方法吗?
P.S。我知道您可以创建另一个方法HandleUpdate(object,EventArgs)并将事件附加到该方法。但我对编译器实际发生的事情更加好奇。
答案 0 :(得分:2)
这很复杂。 IIRC(我可能离开这里,已经有一段时间了,因为我已经阅读了确切的细节),两个表达式可以“解析”到同一个实例,但实际上这很难做到,因为表达式倾向于创建略有不同的闭包,需要用表达式提升。基本上,呼叫站点也很重要。
答案 1 :(得分:1)
根据我的经验,它会生成两份副本。可能有一些我没有打过的优化,但每次检查我的代码时,我都会得到两份。
如果您要重复处理,我建议您创建一个HandleUpdate方法,如上所述。
答案 2 :(得分:1)
将lambda表达式放在同一个类中并不足以将表达式视为相同,因为编译器会考虑它们在其中调用的方法。
在同一个方法中使用相同的表达式两次,你可能会获得相同的实例,但我不会编写依赖于此行为的代码。
如果您确实需要了解编译器的当前行为,请获取reflector的副本并查看生成的IL。