C#自定义事件的写法

C#事件基于委托

例1:只用于学习,理解事件底层原理,不推荐这么写;
例2:系统用的就是该方式,例如按钮的Click事件;
例3:最简略的写法,但是需要客户代码转换EventArgs;

1、事件声明完整格式范例: 

 1 //自定义事件参数,默认以EventArgs结尾,需要继承EventArgs类
 2     public class MyEventArgs : EventArgs
 3     {
 4         public int ID { get; set; }
 5         public string Name { get; set; }
 6     }
 7     //声明委托类型
 8     public delegate void MyEventHandler(object sender, MyEventArgs e);
 9     public class MyClass
10     {
11         //声明委托字段
12         private MyEventHandler myEventHandler;
13         //定义事件
14         public event MyEventHandler MyEvent
15         {
16             add
17             {
18                 myEventHandler += value;
19             }
20             remove
21             {
22                 myEventHandler -= value;
23             }
24         }
25         public void Action()
26         {
27             
28             OnOrder(1, "jack");
29         }
30         //触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
31         private void OnOrder(int id, string name)
32         {
33             if (myEventHandler != null)
34             {
35                 MyEventArgs e = new MyEventArgs
36                 {
37                     ID = id,
38                     Name = name
39                 };
40                 //触发事件
41                 myEventHandler.Invoke(this, e);
42             }
43         }
44     }

 

2、事件声明简化格式范例:

 1 //事件参数,默认以EventArgs结尾,需要继承EventArgs类
 2     public class MyEventArgs : EventArgs
 3     {
 4         public int ID { get; set; }
 5         public string Name { get; set; }
 6     }
 7     //声明委托类型
 8     public delegate void MyEventHandler(object sender, MyEventArgs e);
 9     public class MyClass
10     {
11         //定义事件
12         public event MyEventHandler MyEvent;
13         public void Action()
14         {
15             OnOrder(1, "jack");
16         }
17         //触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
18         private void OnOrder(int id, string name)
19         {
20             if (MyEvent != null)
21             {
22                 MyEventArgs e = new MyEventArgs
23                 {
24                     ID = id,
25                     Name = name
26                 };
27                 //触发事件
28                 MyEvent.Invoke(this, e);
29             }
30         }
31     }

 

3、事件声明通常不需要自定义委托类型,一般使用系统自带的EventHandler 类型

 1 //事件参数,默认以EventArgs结尾,需要继承EventArgs类
 2     public class OrderEventArgs : EventArgs
 3     {
 4         public int ID { get; set; }
 5         public string Name { get; set; }
 6     }
 7     public class MyClass
 8     {
 9         //定义事件
10         public event EventHandler MyEvent;
11         public void Action()
12         {
13            
14             OnOrder(1, "jack");
15         }
16         //触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
17         private void OnOrder(int id, string name)
18         {
19             if (MyEvent != null)
20             {
21                 OrderEventArgs e = new OrderEventArgs
22                 {
23                     ID = id,
24                     Name = name
25                 };
26                 //触发事件
27                 MyEvent.Invoke(this, e);
28             }
29         }
30     }
posted @ 2024-05-30 14:50  soliang  阅读(93)  评论(0编辑  收藏  举报