C# Event事件

事件是一种特殊的多播委托(一个委托中包含多个调用的方法,但是调用的顺序无法保证,可以使用Delegate类的GetInvocationList()),可以通过事件向其他类或对象通知发生的事情;

发送(引发)事件的类称为 --- 发行者

接收(处理)事件的类称为 --- 订户(订阅者)


事件具有以下属性

发行者确定何时引发事件,订阅者确定对事件作出何种响应;

一个事件可以有多个订阅者,订阅者可以处理来自多个发行者的事件

没有订阅者的事件永远不会引发

当事件具有多个订户时,引发该事件时会同步调用事件处理程序。

事件基于 EventHandler委托 和 EventArgs基类;继承关系:Object → Delegate → EventHandler

public delegate void EventHandler(object sender, TEventArgs e);

订阅&取消事件:

1. 定义一个事件处理程序方法,其签名与该事件的委托签名匹配。 例如,如果事件基于 EventHandler 委托类型,则下面的代码表示方法存根:

void HandleCustomEvent(object sender, CustomEventArgs a)  
{  
   // Do something useful here.  
} 
2. 使用加法赋值运算符 (+=) 来为事件附加事件处理程序。 在下面的示例中,假设名为 publisher 的对象拥有一个名为 RaiseCustomEvent 的事件。

     请注意,订户类需要引用发行者类才能订阅其事件。

	public void HandleCustomEvent(object sender, XxEventArgs e)
        {
            // do something
        }
注意:上面的XxEventArgs必须继承于 EventArgs

(a) C# 2.0 语法:

	publisher.RaiseCustomEvent += HandleCustomEvent;  
(b) C#1.0 语法:必须使用 new 关键字显式创建封装委托
	publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);
(c) 匿名方法 、 Lambda表达式

3. 使用 -= 取消订阅事件

使用减法赋值运算符 (-=) 取消订阅事件:
publisher.RaiseCustomEvent -= HandleCustomEvent;  
所有订户都取消订阅事件后,发行者类中的事件实例将设置为 null。


================================================

Event事件的三个要素:

1. 事件发行者 - - 达到某些条件时激发事件的对象;

2. 事件订阅者 - - 订阅事件并对事件发生时进行处理的对象;

3. 定义发行者和订阅者关系,一个发行者可以有多个订阅者;


Event 与 委托之间的区别:

1. 委托允许直接通过委托去访问相应的处理函数,而事件则只能通过公布的回调函数去调用;

2. 事件只能通过 += 、 -= 方式注册和取消订阅者处理函数,而委托除此之外还可以使用  =   直接复制处理函数;


//事件参数
    public class CarInfoEventArgs : EventArgs
    {
        public string Car { get; private set; }
        public CarInfoEventArgs(string car)
        {
            this.Car = car;
        }
    }

    //事件发行者
    public class CarDealer
    {
        //事件:第一个参数为对象,包含事件的发送者;第二个参数随不同的事件类型而不同,但必须派生于 EventArgs
        public event EventHandler NewCarInfo;

        public void NewCar(string car)
        {
            Console.WriteLine("CarDealer: new car {0}", car);

            RaiseNewCarInfo(car);
        }

        //将事件包含在受保护的虚方法中,以使得派生类能够引发事件
        protected virtual void RaiseNewCarInfo(string car)
        {
            EventHandler newCarInfo = NewCarInfo;

            //如果没有订阅处理程序,则委托是空的
            if (newCarInfo != null)
            {
                newCarInfo(this, new CarInfoEventArgs(car));
            }
        }
    }

//事件订阅者
    class Consumer
    {
        private string name;

        public Consumer(string name)
        {
            this.name = name;
        }

        public void NewCarIsHere(object sender, CarInfoEventArgs e)
        {
            Console.WriteLine("{0}: car {1} is new", name, e.Car);
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            var dealer = new CarDealer();

            var mike = new Consumer("Mike");

            //继承关系: Object → Delegate → EventHandler
            dealer.NewCarInfo += new EventHandler(mike.NewCarIsHere);

            var jack = new Consumer("Jack");
            dealer.NewCarInfo += jack.NewCarIsHere;

            dealer.NewCar("BMW");




            Console.ReadKey();
        }



链接:

msdn: event

http://www.cnblogs.com/chengxingliang/archive/2013/05/21/3051912.html

你可能感兴趣的:(C#语法学习)