不过实际上我们也很少用到这两参数,让它们摆在那不管,自己在函数中写其他代码就行了。 自定义事件 另外除了预定义好的事件可以直接拿来用外,我们还可以自己定义些事件,使用的语法格式完全一样。自已定义的事件不一定得是窗体事件,可以是其他任何东东。比如某个变量值达到多少时触发个事件之类的。 自定义的事件具体是怎么触发它执行的由于已经封装了我们也看不到。不过如果是自定义事件肯定得指定怎么去执行。举个简单的例子看下吧。 public delegate void SayHello(string str); //声明一个代理 public event SayHello onSayHello; //定义一个事件onSayHello 触发事件执行的代码就是 string msg = “arwen”; onSayHello(msg); //看起来跟调用一个函数没啥区别了。当然你调用它之前还得先绑定一个函数给它,不然会出错的。所以一般用if(onSayHello != null)这样判断一下,如果事件还没绑定啥函数上去就为null 那既然事件都跟调用函数都差不多了,还不如直接调用函数或者调用代理,为啥搞得多此一举,再整个事件来啊。 用自定义事件可能基于两种原因吧,当然这是我自己瞎猜的啊 一,是体现一种设计模式,订阅者模式。 二,是当体现封装原则。 比如一个class想调用另外一个class中某个函数时,不想让直接调用,或者函数声明为private的,就可通过event间接的调用。因为delegate相当于指向函数的指针,而event又相当于是对delegate的封装。那你可能又问封装有啥好的啊,这可能是体现一种设计思想,对以后扩充功能或做一些额外的处理有用吧。不然像像我们把所以类中的字段都给封装成一个个的属性(property),大部分时候是一点都看不出来有啥用,反而觉得有点多此一举,还不如直接用字段别用属性呢。但如果我们有时想在属性中做些额外的处理时特别有用。比如只让你读取字段值不让赋值,或者反过来。 举个用自定义事件调用其他类中的private函数的简单例子吧。 在class A中有private的函数sayHello.那class B中肯定不能直接调用sayHello了。当然我们另外还要假设在A中用到了B. delegate void DelegateSayHello(string name); //在类外面某个地方,它其实也可以看成一种特殊的类了。当然也可以放在某个类里面定义 public class A { B sb; sb.HowAreYou += new DelegateSayHello(sayHello); private void sayHello(string name) { Console.WriteLine(“Hello,” + name); } } public class B { public event DelegateSayHello HowAreYou; string name = “arwen”; private void DoSomething() { HowAreYou(name); //这里就调用了class A中的private函数sayHello了啊 } } |