为什么通过for循环插入List的委托相等,直接插入的委托不相等?
差异原因核心分析
- 先明确C#委托相等的判定规则
两个委托实例相等需要同时满足:
Method属性指向同一个方法实现、Target属性指向同一个关联对象,多播委托的调用列表结构完全一致。
- 手动两次添加Lambda输出不等的原因
你在两行独立代码中分别定义的两个Lambda,在C# 5及更早版本的编译器逻辑里,属于不同语法位置的匿名函数,就算逻辑完全一致、没有捕获任何外部变量,编译器也不会做跨位置的实例缓存,会分别生成两个不同的私有方法对应两个Lambda,最终创建的两个委托指向不同的方法,自然不相等,所以输出Two Delegates did not match。 - for循环内添加Lambda输出相等的原因
循环里的Lambda仅出现在同一个语法位置,每次循环只是重复执行同一段添加逻辑,编译器会识别到这个Lambda没有捕获外部变量,会将生成的委托实例做静态缓存,每次Add操作实际都是把同一个缓存好的委托实例加入列表,列表里的两个元素本质是同一个对象,Equals判断自然返回true,所以输出Two Delegates are equal。
补充说明:C# 6及之后的Roslyn编译器优化了无捕获Lambda的缓存规则,同一个方法内所有逻辑一致、无外部变量捕获的Lambda都会复用同一个委托实例,这种情况下第一种手动两次添加的写法也会输出两个委托相等。
内容的提问来源于stack exchange,提问作者UkFLSUI
相关产品推荐
相关产品推荐

