C#中的lambda表达式?

Mat*_*att 2 c# lambda anonymous-delegates

我是新手,有人可以解释(以下代码)的意义,或者可能链接到一些关于lambda表达式的有用信息?我在测试中遇到以下代码,我想知道为什么有人会这样做:

foo.MyEvent += (o, e) => { fCount++; Console.WriteLine(fCount); };

foo.MyEvent -= (o, e) => { fCount++; Console.WriteLine(fCount); };
Run Code Online (Sandbox Code Playgroud)

我的直觉告诉我这是一件简单而不是错误的事情,但我对这些表达方式知之甚少,无法理解为什么要这样做.

Meh*_*ari 10

λ表达式(o, e) => { fCount++; Console.WriteLine(fCount); }被解释为一个匿名方法有两个参数o, e(其类型与用于委托类型被推断MyEvent并返回void,它捕获fCount在封闭方法的主体变量(如果它是一个局部变量),该+=操作者将订阅事件的匿名方法和-=取消订阅事件的委托.


更新(re:关于委托实例相等性的问题):

重要的是要知道尝试取消订阅这样的事件并不是一个好主意.语言规范允许,但不要求第二行中的委托等于第一行中的委托.也就是说,允许编译器将两个匿名函数体视为相同的函数,或者它是否相同(因为匿名函数体在语义上是相同的,并且捕获的变量集也是相同的).即使它在编译器中按预期工作,它也可能在下一个版本中中断.引用C#语言规范:

C#语言规范(第7.9.8节委托相等运算符):

通过评估具有相同(可能为空)的捕获外部变量实例集的语义相同的匿名函数表达式而产生的调用列表条目是允许(但不是必需的)相等的.

如果编译器将两个匿名函数表达式视为相等,则第二行将取消订阅事件中的先前匿名方法.如果不是,则第二行不会执行任何特殊操作(如果列表中尚不存在代理,则从事件调用列表中取消订阅不是错误).