第510篇-Delegate和Event异同--(内容篇6:共6篇)
有没有办法像使用属性一样来完成上面的例子呢(如何让事件只允许一个客户订阅)?答案是有的,C#中提供了一种叫事件访问器(Event Accessor)的东西,它用来封装委托变量.
代码逻辑:
namespace DelegateEventDemo { class Class4 { static void Main1(string[] args) { Publishser pub = new Publishser(); Subscriber1 sub1 = new Subscriber1(); Subscriber2 sub2 = new Subscriber2(); pub.NumberChanged -= sub1.OnNumberChanged; // 不会有任何反应 pub.NumberChanged += sub2.OnNumberChanged; // 注册了sub2 pub.NumberChanged += sub1.OnNumberChanged; // sub1将sub2的覆盖掉了 pub.DoSomething(); // 触发事件 } } // 定义委托 public delegate string GeneralEventHandler(); // 定义事件发布者 public class Publishser { // 声明一个委托变量 private GeneralEventHandler numberChanged; // 事件访问器的定义 public event GeneralEventHandler NumberChanged { add { numberChanged = value; } remove { numberChanged -= value; } } public void DoSomething() { // 做某些其他的事情 if (numberChanged != null) { // 通过委托变量触发事件 string rtn = numberChanged(); Console.WriteLine("Return: {0}", rtn); // 打印返回的字符串 } } } // 定义事件订阅者 public class Subscriber1 { public string OnNumberChanged() { Console.WriteLine("Subscriber1 Invoked!"); return "Subscriber1"; } } // 定义事件订阅者 public class Subscriber2 { public string OnNumberChanged() { Console.WriteLine("Subscriber1 Invoked!"); return "Subscriber1"; } } }
注意,因为subseribe2的值被subscribe1重写了,所以不会被调用.