目录
委托与事件的主要区别
1. 定义和本质
2. 可访问性
3. 修改与触发
4. 目的与使用场景
举例
1. 更适合使用委托的场景
2. 更适合使用事件的场景
5. 封装和安全性
委托与事件的相同点
1.基于委托
2.支持多播
3.通知机制
委托与事件的对比总结
委托与事件的关系
1.委托是事件的基础
2.委托可以直接调用,而事件不能直接触发
本篇文章来学习一下委托与事件的区别,以及它们之间的关系。
委托与事件的主要区别
1. 定义和本质
1)委托(Delegate):委托是一种数据类型,可以存储方法的引用,允许通过该引用调用方法,也允许通过 += 和 -= 操作符来添加或删除方法。简而言之,委托是一种数据类型,委托代表的是方法,当调用委托时就是调用了这个方法。
public delegate 返回类型 委托类型名(形参列表);
2)事件(Event):事件是一种特殊的委托,它基于委托,是委托的封装,确保外部代码不能直接更改事件的委托列表(即确保事件不能被直接赋值或修改),只能通过订阅 += 和取消订阅 -= 来操作事件。
public event 委托类型 事件名;
2. 可访问性
1)委托:委托对象是可以公开访问和修改的。任何持有委托实例的代码都可以直接调用它所绑定的方法。
2)事件:事件的委托实例仅能由事件的定义者(通常是类的发布者)触发,而不能由订阅者直接调用。订阅者只能添加或移除事件处理程序,但不能直接触发事件。
3. 修改与触发
1)委托:委托的实例可以随时被修改(通过 += 或 -=)和触发(通过调用委托实例)。外部代码可以通过赋值的方式将不同的方法绑定到同一个委托上,也可以直接触发这些方法。
2)事件:事件的委托实例不能直接修改。订阅者不能更改事件所绑定的委托对象,只能添加或移除事件处理程序(方法)。事件只能由定义事件的类触发,外部代码不能直接触发事件。
4. 目的与使用场景
1)委托:委托用于方法的引用,常用于回调函数、异步编程、方法参数传递等场景。委托可以在运行时动态调用不同的方法。
2)事件:事件用于实现发布-订阅模式,通常用于通知多个订阅者某个事件的发生。例如,按钮点击事件、文件上传完成事件等。
举例
1. 更适合使用委托的场景
如:计算两个数字的运算。需要根据不同的运算类型执行不同的操作,例如加法、减法等。在这种情况下,委托可以作为一种灵活的方式来传递方法。
using System;public class Calculator
{// 定义一个委托类型public delegate int Operation(int a, int b);public static int Add(int a, int b){return a + b;}public static int Subtract(int a, int b){return a - b;}public static void Main(){// 创建委托实例,指向 Add 方法Operation operation = Add;Console.WriteLine("Add: " + operation(5, 3)); // 输出 8// 将委托指向 Subtract 方法operation = Subtract;Console.WriteLine("Subtract: " + operation(5, 3)); // 输出 2}
}
输出结果:
2. 更适合使用事件的场景
如:温度超过阈值时触发报警。
using System;public class Button
{// 定义一个事件,基于委托类型public event EventHandler Clicked;// 模拟按钮点击public void Click(){Console.WriteLine("Button clicked!");// 触发事件OnClicked(EventArgs.Empty);}// 触发事件的方法protected virtual void OnClicked(EventArgs e){Clicked?.Invoke(this, e);}
}public class Program
{public static void Main(){// 创建 Button 实例Button button = new Button();// 订阅事件button.Clicked += ButtonClicked;// 点击按钮,触发事件button.Click();}// 事件处理程序static void ButtonClicked(object sender, EventArgs e){Console.WriteLine("Event: The button was clicked.");}
}
输出结果:
5. 封装和安全性
1)委托:委托实例可以被直接修改或清空,这样可能导致程序行为不一致。没有对外部代码的访问限制,委托实例可以由外部任意修改。
2)事件:事件是委托的一种封装,外部代码不能直接修改事件的委托实例,只能订阅或取消订阅事件。事件提供了更高的封装性和安全性,避免了外部代码对事件委托的直接操作。
委托与事件的相同点
1.基于委托
事件本质上是基于委托的封装。委托是事件内部的实际机制,事件就是一个特殊类型的委托。因此,事件也是通过委托来实现方法的调用。
2.支持多播
委托和事件都支持多播。通过 += 操作符,多个方法可以绑定到同一个委托或事件上,这些方法会依次执行。
3.通知机制
委托和事件都可以用于通知多个订阅者某个操作或状态的变化。例如,一个委托可以存储多个方法,依次调用它们,而事件可以有多个订阅者,事件触发时会通知所有订阅者。
委托与事件的对比总结
特性 | 委托 | 事件 |
---|---|---|
本质 | 委托是方法的引用 | 事件是基于委托的封装 |
定义方式 | 可以直接创建并赋值委托实例 | 事件通过event关键字定义,使用委托类型 |
可访问性 | 直接访问委托实例并调用方法 | 只能通过 += 和 -= 操作符订阅和退订 |
触发方式 | 可以直接触发委托绑定的方法 | 只能由事件的定义者触发事件 |
修改与订阅 | 委托实例可以随时修改(通过 += 或 -=) | 订阅者只能添加或移除处理程序,无法直接修改 |
封装性 | 委托没有封装限制 | 事件对委托进行了封装,提供更强的封装性 |
多播能力 | 支持多播,多个方法可以绑定到同一个委托 | 支持多播,多个处理程序可以订阅同一个事件 |
用途 | 适用于方法引用、回调、异步等场景 | 适用于事件驱动编程和发布-订阅模式 |
委托与事件的关系
1.委托是事件的基础
事件是基于委托实现的,实际上,事件的类型就是一个委托类型。委托指定了事件处理方法的签名,并且通过委托引用这些方法。
事件本质上是对委托的封装,它限制了外部代码的访问方式(只能订阅和取消订阅),而不能直接触发事件。
2.委托可以直接调用,而事件不能直接触发
委托允许外部代码调用和修改(添加或移除)方法,而事件只允许由定义事件的类触发,外部代码只能订阅或取消订阅。
委托本身可以直接作为方法的类型使用,而事件是委托的特殊形式,用于实现发布/订阅模式。
总结:
委托是事件的基础,它定义了事件处理方法的签名。
事件是委托的封装,它限制了对委托的访问,仅允许订阅和触发事件,而不能直接调用。
事件通过委托来实现回调机制,事件的订阅和触发是事件机制的核心,而委托允许将方法作为参数传递,并实现灵活的回调机制。简而言之,委托是事件实现的基础,事件是委托的一种使用方式(用途)。事件离不开委托。
想要进一步学习委托与事件,可以参考【一文了解】C#重点-委托1、【一文了解】C#重点-委托2、【超详细】C#事件。
好了,本次的分享到这里就结束啦,希望对你有所帮助~