c#事件

对于c#事件,很多人对于它是很畏惧的,对于跨过这个坎来说是很简单的,但是没跨过这个坎的人来说是很难的,以前我也是也很畏惧事件,但是有好的的教材和视频是跨过这道坎的关键。我推荐大家看程杰的《大话设计模式》书上面对事件的介绍,视频我推荐大家看陈广老师的《事件》.对于事件的举例我认为有很多的经典案例比如“猫和老鼠”,“学校放假”,“出版社发行刊物,读者订阅”,我们天天有QQ邮箱订阅书籍就是一个很好的事件例子,比如我们用QQ邮箱订阅了读者、意林、青年文摘、知音等等。下面就来看看如果实现“邮件订阅”

首页我们要声明一个出版社类Press,Press可以发行读者、意林、青年文摘、知音刊物等等,那刊物发行的时候我们怎么可以收到呢,我们就必须得先去订阅,这里的订阅是通过QQ邮箱订阅,这里我定义一个QQMailBoxSubscriber类。下面看具体代码的实现.

//声明一个委托
public delegate void PressIssueEventHandler();  //委托的声明位置和类(class)一样
class Press{
   public event PressIssueEventHandler PressIssue; //事件声明位置和类字段一样,事件其实是特殊的委托
   private string name;
   public Press(string name)
   {
      this.name=name;
   }
   public void Issue() //出版社发行刊物方法
   {
       if(PressIssue!=null){
          PressIssue();
       }
   }
}
//下面我们声明一个QQMailBoxSubscriber类
class QQMailBoxSubscriber{
   private string name;
   public QQMailBoxSubscriber(string name)
   {
      this.name=name;
   }
   public void Recieve(){//接收邮件方法这个方法要和委托类型一致
      Console.WriteLine("刊物已经发行,QQ邮箱{0}已经收到邮件",name);
   }
}
class Test{
    static void Main(){
       Press press =new Press("意林");
       QQMailBoxSubscriber subscriber1=new QQMailBoxSubscriber("1144106538");
       QQMailBoxSubscriber subscriber2=new QQMailBoxSubscriber("347071765");
       press.PressIssue+=new PressIssueEventHandler(subscriber1.Recieve);//将方法和委托关联(登记方法)
       press.PressIssue+=new PressIssueEventHandler(subscriber2.Recieve);
       press.Issue();//调用出版社的发行刊物方法
     }
}
运行的结果如下:
 
我们仔细看看上面的代码有改进的地方。1.我们为出版社定义了构造函数,用来初始化出版社的名字,但是没有用上,这里我们要写一个类
用来具体说明出版社发行了什么刊物。
PressIssueEventArgs事件类但是它必须要继承EventArgs类,添加了事件类之后,委托也要相应改变应该现在要带两个参数

public delegate void PressIssueEventHandler(object sender,PressIssueEventArgs e);

参数解析

参数1:触发事件的对象。假如你按下按钮,那么sender就是按钮

参数2:包含跟该事件相关的信息。例如"用鼠标点击窗体"这个事件发生,那么e会包含点击的位置等等。


using System;
public class PressIssueEventArgs:EventArgs{
   private string name;
   public string Name{
      get{return name;}
      set{name=value;}
   }
}
//声明一个委托
public delegate void PressIssueEventHandler(object sender,PressIssueEventArgs e);  //委托的声明位置和类(class)一样
class Press{
   public event PressIssueEventHandler PressIssue; //事件声明位置和类字段一样,事件其实是特殊的委托
   private string name;
   public Press(string name)
   {
      this.name=name;
   }
   public void Issue() //出版社发行刊物事件
   {
       if(PressIssue!=null){
          PressIssueEventArgs e=new PressIssueEventArgs(); //声明并实例化PressIssueEventArgs ,并给Name属性赋值
          e.Name=this.name;
          PressIssue(this,e);
       }
   }
}
//下面我们声明一个QQMailBoxSubscriber类
class QQMailBoxSubscriber{
   private string name;
   public QQMailBoxSubscriber(string name)
   {
      this.name=name;
   }
   public void Recieve(object sender,PressIssueEventArgs e){//接收邮件方法这个方法要和委托类型一致
      Console.WriteLine("{0}刊物已经发行,QQ邮箱{1}已经收到邮件",e.Name,name);
   }
}
class Test{
    static void Main(){
       Press yilin =new Press("意林");
       Press duzhe =new Press("读者");
       QQMailBoxSubscriber subscriber1=new QQMailBoxSubscriber("1144106538");
       QQMailBoxSubscriber subscriber2=new QQMailBoxSubscriber("347071765");
       yilin.PressIssue+=new PressIssueEventHandler(subscriber1.Recieve);//将方法和委托关联(登记方法)
       yilin.PressIssue+=new PressIssueEventHandler(subscriber2.Recieve);
       yilin.Issue();//调用出版社的发行刊物方法

       duzhe.PressIssue+=new PressIssueEventHandler(subscriber1.Recieve);//将方法和委托关联(登记方法)
       duzhe.Issue();//调用出版社的发行刊物方法
     }
}

运行结果如下


结果解释,当出版社出版意林刊物时,邮箱1144106538和347071765都订阅了,所以就收到了邮件

当出版社出版读者刊物时,邮箱1144106538订阅了,但是347071765木有订阅,所以只有1144106538邮箱收到了邮件

你可能感兴趣的:(C#,事件,C#事件)