Tag: 代表

为什么使用事件来代表我可以做什么呢?

我知道事件总是与代表联系在一起。 但是,我错过了一些事件的核心用法,并试图理解这一点。 我创建了一个简单的事件程序,如下所示,它工作得很好。 namespace CompleteRef3._0 { delegate void someEventDelegate(); class EventTester { public event someEventDelegate someEvent; public void doEvent() { if (someEvent != null) someEvent(); } } class Program { static void EventHandler1() { Console.WriteLine(“Event handler 1 called..”); } static void EventHandler2() { Console.WriteLine(“Event handler 2 called..”); } static void EventHandler3() { Console.WriteLine(“Event handler 3 […]

Action 参数的通用方法

所以,我确信之前已在某处回答过,但我无法在任何地方找到它。 希望一些仿制药大师可以提供帮助。 public interface IAnimal{} public class Orangutan:IAnimal{} public void ValidateUsing(Action action) where T : IAnimal { Orangutan orangutan = new Orangutan(); action(orangutan); //Compile error 1 //This doesn’t work either: IAnimal animal = new Orangutan(); action(animal); //Compile error 2 } 参数类型’T’不能赋予参数类型’Orangutan’ 参数类型’IAnimal’不能分配给参数类型’T’ 编辑:基于Yuriy和其他人的建议 ,我可以做一些演员,如: public void ValidateUsing(Action action) where T : IAnimal { Orangutan orangutan […]

.NET:EventHandler竞争条件修复如何工作?

如果另一个线程从MyEvent取消订阅,将其设置为null,则会出现以下模式,用于在引发事件时避免竞争条件。 class MyClass { public event EventHandler MyEvent; public void F() { EventHandler handler = MyEvent; if(handler != null) handler(this, EventArgs.Empty); } } 与错误的做法相反,这种做法容易发生这种竞争: class MyClass { public event EventHandler MyEvent; public void F() { if(MyEvent != null) MyEvent(this, EventArgs.Empty); } } 我的问题是,鉴于System.Delegate是一个引用类型:如果MyEvent不为null,为什么会这样 EventHandler handler = MyEvent; 似乎复制其调用列表而不是获取引用。 我希望将MyEvent委托分配给’handler’变量,然后一旦有人改变了 MyEvent,那么’handler’引用的对象也将被更改。 显然,事实并非如此,否则这个漂亮的小模式将无法奏效。 我查看了.NET源代码,但仍然找不到我的答案(它可能在那里,但我已经找了大约一个小时但找不到它,所以我在这里。)我也读过C#语言规范对事件和代表的评价是什么,但它没有解决这个问题。 谢谢你的时间。

在C#中使用Action 作为参数(模仿函数指针)

我需要编写一个委托函数,可以围绕基本的UDP调用“包裹”一些/ try / catch代码来validation链接。 我为Func工作了一个没有参数的函数,但我不能让它适用于Action,它有一个参数(但没有返回)。 在没有编译器抱怨的情况下,我似乎无法以逻辑方式传递参数。 我错了吗? 我是C#的新手,我基本上试图模仿函数指针的想法。 我不应该重载这个function吗? 我知道你不能重载代表(我认为这就是Func和Action存在的原因)。 这有效: protected TResult udpCommand(Func command) { TResult retValue = default(TResult); while (!linkDownFail) { try { retValue = command(); break; } catch { LinkStateCallBack(ip, getLinkStatus()); if (linkDownFail) throw new LinkDownException(); Thread.Sleep(100); } } return retValue; } 但这不是: protected void udpCommand(Action command(T value)) { while(!linkDownFail) { try […]

如果委托是不可变的,为什么我可以做x + = y这样的事情?

阅读C#深度,第2版 ,第2.1.2节关于组合和删除代表。 小节标题指出“代表是不可改变的”,并且“关于它们的任何内容都不能改变”。 但是,在下一段中,它讨论了使用类似的结构 x += y; 其中x和y是兼容委托类型的变量。 我不是刚刚换x吗? 或者,当我这样做时(即,立即)处理x时,不变性部分是否处理?

什么是Action ?

什么是Action ,它如何使用?

是否使用Action.Invoke被认为是最佳做法?

如果我有以下代码,我应该调用Action还是应该调用Action.Invoke? public class ClassA { public event Action OnAdd; private void SomethingHappened() { if (OnAdd != null) OnAdd(“It Happened”); //Should it be OnAdd.Invoke(“It Happened”) ??????? } } public class ClassB { public ClassB() { var myClass = new ClassA(); myClass.OnAdd += Add; } private void Add(string Input) { //do something } }

EventHandlers和C#Classes析构函数/ Dispose

我对C#Classes和它们的解构函数有点困惑。 我必须在构造函数中获取的类实例中使用一些事件处理程序: public Foo(IFooHandler handler) { handler.Load += Load; handler.Close += Close; } 当Foo类被销毁时,我需要取消订阅该事件。 我在那里或解构器中实现IDisposable和取消订阅吗? 我需要消耗那些事件,我不能以另一种方式去做。 对于其中一个类,我创建一个实例,检查进度,然后类实例超出范围。 对于另一个,它将保留在MainForm直到表单关闭。 第一个是我担心的,因为它可能仍然有对该事件处理程序的引用而且没有正确地去。 我不想泄漏内存。 何时以及如何取消订阅?

打开通用接口方法的委托

我正在尝试为通用接口方法创建一个打开的实例委托 ,但我一直收到NotSupportedException。 以下是无法运行的简化代码: interface IFoo { void Bar(T j); } class Foo : IFoo { public void Bar(T j) { } } static void Main(string[] args) { var bar = typeof(IFoo).GetMethod(“Bar”).MakeGenericMethod(typeof(int)); var x = Delegate.CreateDelegate(typeof(Action), null, bar); } 最后一行抛出NotSupportedException,“不支持指定的方法”。 相比之下,非通用的开放实例委托运行良好: interface IFoo { void Bar(int j); } class Foo : IFoo { public void Bar(int […]

委托通用类型未知的通用操作。 如何创造这样的东西?

假设我有以下代码。 static class Store { public static TA; public static TB; public static TC; } public static class Store { public static Value A = new Value((v) => Store.A = v); //just an example of what I want public static Value B = new Value((v) => Store.B = v); //just an example of what I […]