首页 > 代码库 > C# 特性之事件

C# 特性之事件

定义事件:

技术分享

技术分享

事件访问修饰符一般为public 定义为公共类型可以使事件对其他类可见

事件定义中还包括委托类型,既可以是自定义委托类型也可以是EventHandler(预定义)

运用"+="运算符来订阅事件,运用"-="运算符来取消订阅事件

例:自定义委托事件

技术分享
 1  class HelloWorld 2    { 3       //定义委托类型 4       public delegate void Marry(string msg); 5       //使用自定义委托类型定义事件 6       public event Marry MarryEvent; 7        //发出事件 8        public void News(string msg) 9        {10            //判断是否绑定了事件处理方法11            if(MarryEvent!=null)12            {13                //触发事件14                MarryEvent(msg);15            }16            17        }18       static void Main(string[] args)19       {20         //初始化新郎官对象21           HelloWorld helloWorld=new HelloWorld();22           //实例化朋友23           Friend zhangsan=new Friend("Zhangsan");24           Friend lishi=new Friend("Lishi");25           Friend zhaoliu=new Friend("Zhaoliu");26           //订阅事件27           helloWorld.MarryEvent += new Marry(zhangsan.SendMessage);28           helloWorld.MarryEvent += new Marry(lishi.SendMessage);29           helloWorld.MarryEvent += new Marry(zhaoliu.SendMessage);30           //发出通知31           helloWorld.News("他要结婚了,到时来");32           Console.WriteLine("---------------------------------------");33           //张三取消订阅34           helloWorld.MarryEvent -= new Marry(zhangsan.SendMessage);35           //发出通知36           helloWorld.News("他要结婚了,到时来");37          Console.ReadKey();38       }39    }40 41     class Friend42     {43         //字段44         public string Name;45         public Friend(string name)46         {47             Name = name;48         }49         //事件处理函数,该函数需要符合Marry委托定义50         public    void SendMessage(string message)51         {52             //输出信息53             Console.WriteLine(message);54             //对事件做出处理55             Console.WriteLine("{0}收到了到时准时参加",Name);56         }57         58     }
事件的订阅与取消

例:预定义委托事件

技术分享
 1  class HelloWorld 2    { 3       //使用自定义委托类型定义事件 4       public event EventHandler MarryEvent; 5        //发出事件 6        public void News(string msg) 7        { 8            //判断是否绑定了事件处理方法 9            if(MarryEvent!=null)10            {11                Console.WriteLine(msg);12                //触发事件13                MarryEvent(this,new EventArgs());14            }15            16        }17       static void Main(string[] args)18       {19         //初始化新郎官对象20           HelloWorld helloWorld=new HelloWorld();21           //实例化朋友22           Friend zhangsan=new Friend("Zhangsan");23           Friend lishi=new Friend("Lishi");24           Friend zhaoliu=new Friend("Zhaoliu");25           //订阅事件26           helloWorld.MarryEvent += new EventHandler(zhangsan.SendMessage);27           helloWorld.MarryEvent += new EventHandler(lishi.SendMessage);28           helloWorld.MarryEvent += new EventHandler(zhaoliu.SendMessage);29           //发出通知30           helloWorld.News("他要结婚了,到时来");31           Console.WriteLine("---------------------------------------");32           //张三取消订阅33           helloWorld.MarryEvent -= new EventHandler(zhangsan.SendMessage);34           //发出通知35           helloWorld.News("他要结婚了,到时来");36          Console.ReadKey();37       }38    }39 40     class Friend41     {42         //字段43         public string Name;44         public Friend(string name)45         {46             Name = name;47         }48         //事件处理函数,该函数需要符合Marry委托定义49         public    void SendMessage(object s,EventArgs e)50         {51             //对事件做出处理52             Console.WriteLine("{0}收到了到时准时参加",Name);53         }54         55     }
使用预定义委托事件订阅与取消

运行结果:

技术分享

在VS中可以用F12查看EventHandler的定义

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

(1)该委托返回类型是void因此实例化委托类型的方法也要满足这点

(2)第一个参数sender负责保存对触发事件对象的引用,其类型为object

(3)第二个参数e保存事件数据,EventArgs类也是.NET类库中定义的类,它不保存任何火数据

 

C# 特性之事件