Tag: 匿名方法

匿名代表在C#

我不能成为唯一一个厌倦了定义和命名一个委托,只需要一个委托的事情。 例如,我想在可能的其他线程的窗体中调用.Refresh(),所以我写了下面的代码: private void RefreshForm() { if (InvokeRequired) Invoke(new InvokeDelegate(Refresh)); else Refresh(); } 我甚至不知道我必须这样做,我只是读了足够的恐惧,以至于在稍后的阶段它不起作用。 InvokeDelegate实际上是在另一个文件中声明的,但是我真的需要一个专门用于此的整个委托吗? 根本没有通用的代表吗? 我的意思是,例如,有一个笔类,但也有钢笔。 select笔,所以你不必重做整个事情。 这是不一样的,但我希望你明白我的意思。

我如何取消注册“匿名”事件处理程序

说如果我听一个事件: Subject.NewEvent += delegate(object sender, NewEventArgs e) { //some code }); 现在我该如何取消注册这个事件? 或者只是让内存泄漏?

C#不能在匿名方法体内使用ref或out参数

我试图创build一个函数,可以创build一个操作,增加任何整数传入英寸然而,我的第一次尝试是给我一个错误“不能在一个匿名方法体内使用ref或out参数”。 public static class IntEx { public static Action CreateIncrementer(ref int reference) { return () => { reference += 1; }; } } 我明白为什么编译器不喜欢这个,但我想有一个优雅的方式来提供一个很好的增量工厂,可以指向任何整数。 我看到要做到这一点的唯一方法就像下面这样: public static class IntEx { public static Action CreateIncrementer(Func<int> getter, Action<int> setter) { return () => setter(getter() + 1); } } 但是,这对于主叫方来说当然是一种痛苦。 要求调用者创build两个lambdaexpression式,而不是只传入一个引用。 有没有更优雅的方式来提供这种function,或者我将只需要住两个lambda选项?

C#中的匿名方法可以自己调用吗?

我有以下代码: class myClass { private delegate string myDelegate(Object bj); protected void method() { myDelegate build = delegate(Object bj) { var letters= string.Empty; if (someCondition) return build(some_obj); //This line seems to choke the compiler else string.Empty; }; …… } } 有没有另外一种方法来build立一个匿名方法在C#中,以便它可以调用自己?

添加和删​​除匿名事件处理程序

我想知道这是否真的有效? private void RegisterKeyChanged(T item) { item.OnKeyChanged += (o, k) => ChangeItemKey((T)o, k); } private void UnRegisterKeyChanged(T item) { item.OnKeyChanged -= (o, k) => ChangeItemKey((T)o, k); } 编译器如何知道事件处理程序是相同的? 这甚至推荐?

何时不使用lambdaexpression式

许多问题正在堆栈溢出回答,成员指定如何使用lambdaexpression式解决这些现实世界/时间问题。 我们是否过度使用,是否考虑了使用lambdaexpression式的性能影响? 我发现了一些文章,探讨了lambda与匿名代理vs不同结果for / foreach循环的性能影响 匿名委托与Lambdaexpression式与函数调用性能 foreach与List.ForEach的性能 .NET / C#循环性能testing(FOR,FOREACH,LINQ和Lambda) 。 DataTable.Select比LINQ更快 在select合适的解决scheme时,评估标准应该是什么? 除了使用lambda时更简洁的代码和可读性的明显原因。

在devise应用程序时,如何使用Func <>和Action <>?

所有关于Func <>和Action <>的例子都很简单,就像下面的例子一样,你可以看到它们在技术上是如何工作的,但是我希望看到它们用在解决以前无法解决的问题的例子中只有以更复杂的方式来解决,即我知道它们是如何工作的,我可以看到它们是简洁而有力量的 ,所以我想更深入地理解它们解决什么样的问题,以及如何在应用程序devise。 你用什么方式(模式)使用Func <>和Action <>来解决实际问题? 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<string, string> convert = delegate(string s) { return s.ToUpper(); }; //func with lambda Func<string, string> convert2 = s => s.Substring(3, 10); //action Action<int,string> recordIt = (i,title) […]

在C#中,为什么匿名方法不能包含yield语句?

我认为这样做会很好(用lambda做一个yield return): 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(); } 但是,我发现我不能以匿名方式使用收益率。 我想知道为什么。 产量文档只是说这是不允许的。 由于这是不允许的,我只是创build列表并添加项目。

Invoke调用中的匿名方法

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

为什么我不能在debugging器中编辑一个包含匿名方法的方法?

所以,每次我写一个lambdaexpression式或者匿名方法的时候,我都不太清楚 ,我不得不重新编译并重新启动整个应用程序或者unit testing框架来修复它。 这是非常烦人的,而最终我浪费的时间比通过使用这些结构所节省的时间更多。 尽pipeLinq和lambdas是我最喜欢的C#特性之一,但是如果可以的话,我尽量远离它们,这太糟糕了。 我想为什么是这样,有一个很好的技术理由,也许有人知道? 此外,有没有人知道它是否会在VS2010中修复? 谢谢。