【C#】委托与事件

委托与事件的主要区别

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
    }
}
图片[1]-【C#】委托与事件-涣清博客

2. 更适合使用事件的场景

如:温度超过阈值时触发报警

using System;
using UnityEngine;
 
namespace EventExample
{
    public class TemperatureSensorTest : MonoBehaviour
    {
        public void Start()
        {
            //创建一个温度传感器实例,设置阈值为30°C
            TemperatureSensor sensor = new TemperatureSensor(30);
 
            //订阅温度超过阈值时的事件
            sensor.TemperatureExceeded += () =>
            {
                Debug.Log("警告!温度超过阈值!");
            };
 
            //设置不同的温度,看看是否触发事件
            sensor.SetTemperature(35); //会触发事件
            sensor.SetTemperature(25); //不会触发事件
        }
    }
    /// <summary>
    /// 温度传感器类
    /// </summary>
    public class TemperatureSensor
    {
        //定义一个事件,当温度超过设定值时触发
        public event Action TemperatureExceeded;
 
        /// <summary> 温度阈值 </summary>
        private int threshold;
 
        public TemperatureSensor(int threshold)
        {
            this.threshold = threshold;
        }
        /// <summary>
        /// 设置当前温度并检查是否超过阈值
        /// </summary>
        /// <param name="temperature">温度</param>
        public void SetTemperature(int temperature)
        {
            Debug.Log($"当前温度: {temperature}°C");
 
            //温度超过阈值,触发事件
            if (temperature > threshold)
            {
                TemperatureExceeded?.Invoke();
            }
        }
    }
}
图片[2]-【C#】委托与事件-涣清博客

5.封装和安全性

1)委托:委托实例可以被直接修改或清空,这样可能导致程序行为不一致。没有对外部代码的访问限制,委托实例可以由外部任意修改。

2)事件:事件是委托的一种封装,外部代码不能直接修改事件的委托实例,只能订阅或取消订阅事件。事件提供了更高的封装性和安全性,避免了外部代码对事件委托的直接操作。

委托与事件的相同点

1.基于委托
事件本质上是基于委托的封装。委托是事件内部的实际机制,事件就是一个特殊类型的委托。因此,事件也是通过委托来实现方法的调用。

2.支持多播
委托和事件都支持多播。通过 += 操作符,多个方法可以绑定到同一个委托或事件上,这些方法会依次执行。

3.通知机制
委托和事件都可以用于通知多个订阅者某个操作或状态的变化。例如,一个委托可以存储多个方法,依次调用它们,而事件可以有多个订阅者,事件触发时会通知所有订阅者。

图片[3]-【C#】委托与事件-涣清博客
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容