一旦编译完成,是否有区别: delegate { x = 0; } 和 () => { x = 0 } ?
是否有可能取消订阅一个事件的匿名方法? 如果我订阅这样的事件: void MyMethod() { Console.WriteLine("I did it!"); } MyEvent += MyMethod; 我可以像这样取消订阅: MyEvent -= MyMethod; 但是,如果我使用匿名方法订阅: MyEvent += delegate(){Console.WriteLine("I did it!");}; 是否可以取消订阅这个匿名方法? 如果是这样,怎么样?
在C#中使用lambdaexpression式或匿名方法时,我们必须警惕修改的闭包陷阱。 例如: foreach (var s in strings) { query = query.Where(i => i.Prop == s); // access to modified closure … } 由于修改了闭包,上面的代码将导致查询中的所有Where子句基于s的最终值。 正如在这里解释的,这是因为在foreach循环中声明的svariables在编译器中是这样翻译的: string s; while (enumerator.MoveNext()) { s = enumerator.Current; … } 而不是像这样: while (enumerator.MoveNext()) { string s; s = enumerator.Current; … } 正如这里指出的那样,在循环之外声明一个variables没有任何性能优势,在正常情况下,我可以考虑的唯一原因是如果您打算在循环范围之外使用该variables: string s; while (enumerator.MoveNext()) { s = enumerator.Current; … […]