C#动态订阅事件

本文详细介绍了在C#中如何通过两步实现事件订阅:首先定义事件处理函数,其次将处理函数订阅到特定事件上。具体步骤包括创建包含委托参数的函数,并在构造函数或Load事件中将该函数添加到目标事件。

动态订阅事件只需两步:

定义事件处理函数

        public void showMessage(object sender, EventArgs e)
        {
            MessageBox.Show("As");
        }

注意:函数必须包含委托,即以上两个参数,以此表明该函数为订阅事件的函数

订阅事件

button1.Click += new EventHandler(showMessage);

以上为button1按钮的Click事件添加了上述函数响应。

 

在窗口中事件订阅要在构造函数中的 InitializeComponent(); 之后,可以在Load事件中,也可以在代码运行时动态添加。

C# 事件订阅基于委托实现,是一种强大的通知机制,支持多订阅者和同步调用,在用户界面、系统通知和线程通信等场景广泛应用[^1]。 ### 原理 C# 事件本质是对委托的封装,发布者定义事件并管理订阅者列表,提供 `+=` 和 `-=` 运算符来注册和注销订阅者,通过 `Invoke()` 方法触发事件订阅者向发布者注册事件处理方法,该方法需匹配委托签名,避免长时间阻塞影响其他订阅者[^2]。 ### 方法 订阅者通过 `+=` 运算符向发布者的事件注册事件处理方法,退订则使用 `-=` 运算符。 ### 示例 以下是两个不同的示例展示 C# 事件订阅: #### 示例一:计数事件订阅 ```csharp public class Incrementer { public event EventHandler CountedADozen; public void DoCounting() { for (int i = 1; i <= 100; i++) { if (i % 12 == 0) CountedADozen?.Invoke(this, EventArgs.Empty); } } } public class Dozens { public void Subscribe(Incrementer publisher) { publisher.CountedADozen += OnCountedDozen; } private void OnCountedDozen(object sender, EventArgs e) { Console.WriteLine("12的倍数已累计!"); } } ``` 可以使用以下方式调用: ```csharp class Program { static void Main() { Incrementer incrementer = new Incrementer(); Dozens dozens = new Dozens(); dozens.Subscribe(incrementer); incrementer.DoCounting(); } } ``` #### 示例二:汽车信息事件订阅 ```csharp using System; namespace CarDealer { public class CarInfoEventArgs : EventArgs { public string Car { get; } public CarInfoEventArgs(string car) { this.Car = car; } } public class CarDealer { private event EventHandler<CarInfoEventArgs> newCarInfo; public event EventHandler<CarInfoEventArgs> NewCarInfo { add { newCarInfo += value; } remove { newCarInfo -= value; } } public void NewCar(string car) { Console.WriteLine($"CarDealer,new car {car}"); newCarInfo?.Invoke(this, new CarInfoEventArgs(car)); } protected virtual void RaiseNewCarInfo(string car) { newCarInfo?.Invoke(this, new CarInfoEventArgs(car)); } } public class Consumer { public string Name { get; } public Consumer(string name) { Name = name; } public void Subscribe(CarDealer dealer) { dealer.NewCarInfo += NewCarIsHere; } private void NewCarIsHere(object sender, CarInfoEventArgs e) { Console.WriteLine($"{Name} 得知新汽车 {e.Car} 到货!"); } } } ``` 调用代码如下: ```csharp class Program { static void Main() { CarDealer dealer = new CarDealer(); Consumer consumer1 = new Consumer("消费者1"); Consumer consumer2 = new Consumer("消费者2"); consumer1.Subscribe(dealer); consumer2.Subscribe(dealer); dealer.NewCar("宝马X5"); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值