c#事件(续委托之后)
你应该先理解了委托之后,再来看我们的事件滴呀
public delegate void myDelegate(int val); public class Test { public void show(int a,myDelegate de) { de(a); } } class Program { public static void do1(int a) { } public static void do2(int a) { } public static void do3(int a) { } static void Main(string[] args) { Test t = new Test(); int val = 10; myDelegate dele; dele = do1; dele += do2; t.show(val,dele); } }
面向对象设计,讲究的是对象的封装,既然可以声明委托类型的变量,我们何不将这个变量封装到Test类中?在这个类的客户端中使用不是更方便么?于是将
myDelegate dele; 申明在Test的内部
public class Test { myDelegate dele; public void show(int a,myDelegate de) { de(a); } }
调用:
static void Main(string[] args) { Test t = new Test(); t.dele = do1; t.dele += do2; int val = 10; t.show(val,t.dele); }
继续改造:Test类
public class Test { public myDelegate dele; public void show(int a) { if (dele != null) { dele(a); } } }
那么调用就变成这样滴!
static void Main(string[] args) { Test t = new Test(); t.dele = do1; t.dele += do2; int val = 10; t.show(val); }
我们先看看如果把 dele 声明为 private会怎样?结果就是:这简直就是在搞笑。因为声明委托的目的就是为了把它暴露在类的客户端进行方法的注册,你把它声明为private了,客户端对它根本就不可见,那它还有什么用?
再看看把dele 声明为 public 会怎样?结果就是:在客户端可以对它进行随意的赋值等操作,严重破坏对象的封装性!
我擦,那怎么办呢
答案是:事件!
申明一个事件,就相当于申明一个private 的委托滴呀;
在类的内部,不管你声明它是public还是protected,它总是private的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。
那么最后的代码优化成了这样滴呀;
public class Test { //public myDelegate dele; public event myDelegate e; public void show(int a) { if (e != null) { e(a); } } }
想进一步了解委托和事件的应用,请看observe设计模式。