对于事件event触发中this的理解

上面是书籍中事件触发中MarryEvent(this,new EventArgs()); 其中this就是类Bridegroon,将this更改为new Bridegroom也是可以的;那么,我本示例中,我们将this更改为其它对象可不可以呢,我们试一下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace EventUseInNET
 7 {
 8     // 新郎官类,充当事件发布者角色
 9     public class Bridegroom
10     {
11         // 使用.NET类库中预定义的委托类型EventHandler来定义事件
12         public event EventHandler MarryEvent;
13 
14         // 发出事件
15         public void OnBirthdayComing(string msg)
16         {
17             // 判断是否绑定了事件处理方法
18             if (MarryEvent != null)
19             {
20                 Console.WriteLine(msg);
21 
22                 int a = 5;
23                 // 触发事件
24                 MarryEvent(a,new EventArgs());
25             }
26         }
27 
28         static void Main(string[] args)
29         {
30             //初始化新郎官对象
31             Bridegroom bridegroom = new Bridegroom();
32 
33             // 实例化朋友对象
34             Friend friend1 = new Friend("张三");
35             Friend friend2 = new Friend("李四");
36             Friend friend3 = new Friend("王五");
37 
38             // 使用+=订阅事件
39             bridegroom.MarryEvent += new EventHandler(friend1.SendMessage);
40             bridegroom.MarryEvent += new EventHandler(friend2.SendMessage);
41 
42             // 发出通知,此时订阅了事件的对象才能收到通知
43             bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
44             Console.WriteLine("------------------------------------");
45 
46             // 使用-=取消订阅事件,此时李四将收不到通知
47             bridegroom.MarryEvent -= new EventHandler(friend2.SendMessage);
48 
49             // 使用+=订阅事件,此时王五可以收到通知
50             bridegroom.MarryEvent += new EventHandler(friend3.SendMessage);
51 
52             // 发出通知
53             bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
54             Console.Read();
55         }
56     }
57 
58     // 朋友类
59     public class Friend
60     {
61         // 字段
62         public string Name;
63 
64         // 构造函数
65         public Friend(string name)
66         {
67             Name = name;
68         }
69 
70         // 事件处理函数,该函数需要符合EventHandler委托的定义
71         public void SendMessage(object s, EventArgs e)
72         {
73             // 对事件做出处理
74             Console.WriteLine(this.Name + "收到了,到时候准时参加");
75         }
76     }
77 }

我们将22-24行进行了更改,更改为:

                int a = 5;
                // 触发事件
                MarryEvent(a,new EventArgs());

可以发现程序没有报错,也可以正常运行并输出;

posted @ 2022-11-30 16:06  chenlight  阅读(37)  评论(0编辑  收藏  举报