欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > C#区分委托与事件

C#区分委托与事件

2025/1/27 12:20:45 来源:https://blog.csdn.net/grapefruit_lyy/article/details/145285991  浏览:    关键词:C#区分委托与事件

目录

委托与事件的主要区别

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#事件。

           好了,本次的分享到这里就结束啦,希望对你有所帮助~

    版权声明:

    本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

    我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com