Questions tagged «anonymous-methods»

4
C#在foreach中重用变量是否有原因?
在C#中使用lambda表达式或匿名方法时,我们必须警惕对修改后的闭包陷阱的访问。例如: foreach (var s in strings) { query = query.Where(i => i.Prop == s); // access to modified closure ... } 由于修改了闭包,因此上述代码将导致Where查询中的所有子句都基于的最终值s。 正如解释在这里,这是因为该s变量在声明foreach环以上的编译器编译如下: string s; while (enumerator.MoveNext()) { s = enumerator.Current; ... } 而不是像这样: while (enumerator.MoveNext()) { string s; s = enumerator.Current; ... } 如此处所指出的,在循环外声明变量没有任何性能优势,在正常情况下,我能想到的唯一原因是如果您打算在循环范围外使用变量: string s; while (enumerator.MoveNext()) { …

11
取消订阅C#中的匿名方法
是否可以从事件中取消订阅匿名方法? 如果我订阅这样的活动: void MyMethod() { Console.WriteLine("I did it!"); } MyEvent += MyMethod; 我可以这样退订: MyEvent -= MyMethod; 但是,如果我使用匿名方法订阅: MyEvent += delegate(){Console.WriteLine("I did it!");}; 是否可以取消订阅此匿名方法?如果是这样,怎么办?


8
调用调用中的匿名方法
在想要在Control.Invoke中匿名调用委托的语法上有麻烦。 我们尝试了许多不同的方法,但都无济于事。 例如: myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); }); 其中someParameter在此方法本地 以上将导致编译器错误: 无法将匿名方法转换为类型“ System.Delegate”,因为它不是委托类型

5
在C#中,为什么匿名方法不能包含yield语句?
我认为做这样的事情会很好(用lambda进行收益回报): public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() { IList<T> list = GetList<T>(); var fun = expression.Compile(); var items = () => { foreach (var item in list) if (fun.Invoke(item)) yield return item; // This is not allowed by C# } return items.ToList(); } 但是,我发现我不能在匿名方法中使用yield。我想知道为什么。该产量的文档只是说,这是不允许的。 由于不允许使用,我只创建了List并将项目添加到其中。

9
设计应用程序时如何使用Func <>和Action <>?
我可以找到的有关Func &lt;&gt;和Action &lt;&gt;的所有示例都很简单,如下所示,您将看到它们在技术上如何工作,但我希望看到它们用于解决以前无法解决或可能解决的问题的示例中仅以更复杂的方式来解决,即我知道它们的工作原理,并且可以看到它们的简洁和强大,因此我想从更大的意义上理解它们,以解决它们所解决的各种问题以及如何在解决方案中使用它们。应用程序设计。 您以什么方式(模式)使用Func &lt;&gt;和Action &lt;&gt;解决实际问题? using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestFunc8282 { class Program { static void Main(string[] args) { //func with delegate Func&lt;string, string&gt; convert = delegate(string s) { return s.ToUpper(); }; //func with lambda Func&lt;string, string&gt; convert2 = s =&gt; s.Substring(3, 10); //action …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.