事件

using System;
class Publisher //出版商
{
 public delegate void Publish();//声明事件所要的代理
 public event Publish OnPublish;//声明一个事件
 public void issue() //触发事件
 {
  //判断是否有这一事件的触发代理
  if(OnPublish!=null) //事件是一个名词,而不是一个方法。
  {
   Console.WriteLine(“发行杂志”);
   OnPublish();
  }
 }
}
class Subscriber  //订阅者
{
 public void Received()
 {
  Console.WriteLine(“收到杂志”);
 }
}
class test
{
 static void Main()
 {
  Publisher a=new Publisher();
  Subscriber b=new Subscriber();
  a.OnPublish += new Publisher.Publish(b.Received);//添加事件
  a.issue();//触发事件
 }
}

事件(event):

1.      
事件是类在发生其关注的事情时用来提供通知的方式。例如,封装用户界面控件的类可以定义一个在单击该控件时发生的事件。控件类不关心单击按钮时发生了什么,但它需要告知派生类单击事件已发生。然后,派生类可选择如何响应。

2.      
事件发行者(Publisher):

一个事件发行者,也称作发送者(sender),其实就是一个对象,这个对象会自行维护本身的状态信息。当本身状态信息变动时,便触发一个事件,并通知所有的事件订阅者。

事件订阅者(Subscriber):

对事件感兴趣的对象,也称为接收者(Receiver),可以注册感兴趣的事件,通常需提供一个事件处理程序,在事件发行者触发一个事件后,会自动执行这段代码的内容。

  1. 事件的四个步骤:

->①在事件发行者中定义一个事件

->②在事件发行者中触发事件

->③在事件订阅者中定义事件处理程序

->④向事件发行者订阅一个事件

看一段代码:

using System;

//注意下面的四步骤!!!

//事件订阅者

class Subscriber   //订阅者

{

    private string
name;

    public Subscriber(string
name)

    {

        this.name = name;

    }

    //③在事件订阅者中定义事件处理程序

    public void
Receive(string manazineName) //***在事件订阅中定义事件处理程序

    {

        Console.WriteLine(name + “订阅已收到” +
manazineName);

 

    }

}

//事件发布者

class Publisher    //出版社

{

    public delegate void PubComputer(string
magazineName);   //声明事件所需的代理,也就是一委托类型

    public delegate void PubLife(string
magazineName);

    //①在事件发行者中定义一个事件

    public event PubComputer OnPubComputer;   //事件的声明,也就是定义一个委托类型变量

    public event PubLife OnPubLife;

 

    public void
issueComputer()              //***触发事件的方法

官方澳门新永利下载,    {

        if (OnPubComputer != null)

        {

            Console.WriteLine(“发行<<电脑>>杂志”);

            //②在事件发行者中触发事件

           
OnPubComputer(“电脑杂志”);       //***触发一个委托链

        }

    }

    public void
issueLife()

    {

        if (OnPubLife != null)

        {

            Console.WriteLine(“发行<<生活>>杂志”);

            //②在事件发行者中触发事件

           
OnPubLife(“生活杂志”);

        }

    }

}

 

class Story

{

    static void
Main()

    {

        Publisher Pub = new
Publisher();

        Subscriber zs = new
Subscriber(“张三”);

        Subscriber ls = new
Subscriber(“李四”);

        //④向事件发行者订阅一个事件

       
Pub.OnPubComputer += zs.Receive;          //***向事件发行者订阅一个事件

       
Pub.OnPubComputer += ls.Receive;

        Pub.OnPubLife
+= ls.Receive ;

 

       
Pub.issueComputer();   //触发事件

       
Pub.issueLife();

        Console.WriteLine();

        Console.WriteLine(“a year after”);

       
Pub.OnPubComputer -= ls.Receive;

       
Pub.issueComputer();   //触发事件

       
Pub.issueLife();

        Console.ReadLine();

    }

}

4.      
NET Framework事件设计准则:

 

->事件的命名准则应使用PascalCasing命名方式

->声明delegate时,使用void类型当作返回值,EventName事件的事件委托是EventNameEventHandler,事件接受两个传入参数,一律命为sender与e.

->定义一个提供事件数据的类。对类以EventNameEventArgs进行命名,从System.EventArgs派生该类,然后添加所有事件特定的成员。

public delegate void
EventNameEventHandler(object sender, EventNameEventArgs e);

->下面的过程说明如何在类中实现事件。如果事件不提供任何数据,也要声明两参数,e参数可以直接使用系统的System.EventArgs类。
如果需要传递数据,则要从System.EventArgs继承一个类,
并把数据放在里面。

public delegate void EventNameEventHandler(object sender , EventArgs
e);

public event EventNameEventHandler
EventName;

->在引发事件的类中提供一个受保护的方法。以OnEventName进行命名。在该方法中引发该事件:

      protected virtual void
OnEventName(EventArgs e)

{

If ( EventName != null )

{

 EventName(this, e );

}

下面规范化一下上面的代码:

using System;

发表评论

电子邮件地址不会被公开。 必填项已用*标注