.net 基础之事件

C# 事件

使用情况 : 如果某个对象的发生了特定的事情——其他的一个或者多个对象想知道这个对象发生的特定事情的情况   好 我们这个情况下就可以使用事件

那么什么样的类型能够监听那个特定的事件呢  

  I 我们都知道事件是基于委托的。委托是一种能够调用回调方法的一种类型安全的方式。委托还能够回调多个方法。

    事件是对委托的封装。这样通过委托,对象就能够通过回调的方式来实现事件的订阅。事件通过委托维护了一个已登记的方法列表。

 II 那么订阅者要有什么样的能力呢

     1. 是要有一个事件封装的委托想对应的方法。

     2. 这个方法能够登记和注销对事件的关注。

     3. 当事件发生的时候能够收到通知。

打个比方说tom和Jhon都到一个汽车店去买奥迪A8 (没人的汽车的制造厂的要求还是不一样的)但是吧这种汽车还没有到货。老板就说这样吧,等汽车来的时候我们回通知您的。

I  定义类型来容纳需要发送给接收者的事件信息。

public class CarInfoEventArgs : EventArgs
{
       private readonly string carFactory;//汽车的制造工厂
       private readonly string carName;//汽车的名字

       public CarInfoEventArgs(string factory,string name)
       {
               carFactory = factory;
               carName = name;
       }

       public string CarFactory{get{return carFactory;}}
       public string CarName{get{return carName;}}
}
View Code

  当事件发生的时候,事件的发生着可能要向事件的监听者传递一些信息。

II  定义事件成员

internal class CarShop
{
      public event EventHanlder<CarInfoEventArgs>  NewCar;
}

    1. 定义了事件的名称NewCar   2.  这个事件的类型是 EventHanlder<CarInfoEventArgs> 那么监听者的类型定义中就要有一个方法和这个委托的签名向对应

public delegate void EventHanlder<TEventArgs>(Object sender,TEventArgs e) where TEventArgs:EventArgs

III 定义负责引发事件的方法来通知事件的登记对象

    定义一个受保护的虚方法来引发事件

protected virtual void OnNewCar(CarInfoEventArgs e)
{
      if(NewCar != null) NewCar(this,e);
}

IV 定义方法将输入转化为期望的事件

    假设新的车辆到达这个店的时候我们使用一个方法来模仿这个过程

public void NewCarCome(string carfactory,string carName)
{
       CarInfoEventArgs e = new (carfactory,carName);
       OnNewCar(e)
}   

V 定义监听者类型

public sealed class Tom
{
       public Tom(CarShop shop)
       {
           shop.NewCar += ListenCarCome;
       }
       private void ListenCarCome(Object sender,CarInfoEventArgs e)
       {
             if(e.CarFactory == "beijing" && e.CarName=="aodi")
                Console.WriteLine("I will buy");
             else 
                Console.WriteLine("the car is not from beijing I will not buy it");
       }
}

   在这个类中还是要定义一个方法的用来取消对事件的监听

public void UnRegister(CarShop shop)
{
     shop.NewCar -= ListenCarCome;
}

这样我们在嗲用的时候就比较简单了

public void main()
{
      CarShop shop = new CarShop();
      Tom tom = new Tom(shop);

      shop.NewCarCome("beijing","aodi");
}

  我知道这还有好多要改造的地方  供自己学习使用

.net 基础之事件,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。