C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍

简介: 委托(delegate) 与 事件(event) 🔥前言🙏在之前的文章里介绍了C#中的委托(delegate)(Action、Func、Predicate)的基本含义及用法那本篇文章在这里还要介绍一个跟委托有很大关系的小伙伴——C#中的 事件(event)🎅事件跟委托是有很大联系的,所以也就导致很容易分不清他们两个,以及什么时候用这两个上面有博客提到委托,想单独了解委托的可以去看一下,本篇文章主要说一下 什么是事件 🎄以及 事件与委托的区别🎁

委托(delegate) 与 事件(event) 🔥

前言🙏

在之前的文章里介绍了C#中的委托(delegate)

(Action、Func、Predicate)的基本含义及用法


那本篇文章在这里还要介绍一个跟委托有很大关系的小伙伴——C#中的 事件(event)🎅

事件跟委托是有很大联系的,所以也就导致很容易分不清他们两个,以及什么时候用这两个


上面有博客提到委托,想单独了解委托的可以去看一下,本篇文章主要说一下 什么是事件 🎄

以及 事件与委托的区别🎁


委托和事件的定义 💬

委托

在这里再说一遍委托跟事件的简单定义(没有搜到特别准确的,都是大概定义,理解万岁)


委托:delegate 是一种可用于封装命名或匿名方法的引用类型。 委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。


委托是一种动态调用方法的类型,属于引用型。

委托是对方法的抽象和封装。委托对象实质上代表了方法的引用(即内存地址)

委托允许将方法作为参数进行传递。

委托可用于定义回调方法。

委托可以把多个方法链接在一起。这样,在事件触发时可同时启动多个事件处理程序。

委托签名不需要与方法精确匹配。


事件

事件:事件是特殊类型的多路广播委托,仅可从声明它们的类或结构(发行者类)中调用。

如果其他类或结构订阅了该事件,则当发行者类引发该事件时,会调用其事件处理程序方法。


事件表示C#中已定义的一个对象,即处理通知过程的对象

通常,每个事件的发生都会产生发送方和接收方。在.net框架中,事件是将事件发送者(触发事件的对象)与事件接受者(处理事件的方法)相关联的一种代理类,即事件机制是通过代理类来实现的。当一个事件被触发时,由该事件的代理来通知(调用)处理该事件的相应方法


委托和事件的区别

简单说了一下两者的定义,眼神好的小伙伴这时候就会发现,事件的说明里有提到一句话:“事件也可以算一种特殊的委托”,这句话不是特别准确,但是也不妨可以这样理解。

正因为如此,所以要我们先了解了 委托 再来看 事件 ,容易混淆大家的地方大多在于这两者之间的区别,下面说一下委托和事件之间的区别:


委托和事件的区别如下:

image.png

举例说明

我们将创建两个类ClassA和ClassB,这两个类都很简单,只有一个方法,并且这两个类的方法签名一样。ClassC内有委托和事件,为了演示方便,我们将委托和事件的访问权限都设为public。下面我们将主要看看委托和事件在使用上面的区别。

Class1

public class Class1
{
    //声明委托
    public delegate void NumberChanger(int n);
    //声明事件
    public static event NumberChanger changer;
    public static void test()
    {
        changer(100);
    }
    static void Main(string[] args)
    {
        Class1.changer += Class2.ClassA_Test;
        Class1.changer += Class3.ClassA_Test;
        Class1.test();
    }
}

Class2

    class Class2
    {
        public static void ClassA_Test(int i)
        {
            Console.WriteLine("Class2:"+i);
        }
    }

Class3

    class Class3
    {
        public static void ClassA_Test(int i)
        {
            Console.WriteLine("Class3:"+i);
        }
    }
区别一:是否是一个类型
    class Class3
    {
    static void Main(string[] args)
    {
        //委托正确使用
        Class1.NumberChanger n1 = Class2.ClassA_Test;
        //事件使用 编译器报错
        Class1.changer handle2 = Class2.ClassA_Test;
    }

错误:Class1.changer 是“字段”,但此处被当做“类型”来使用


区别二:委托可以在声明它的类外部进行调用,而事件只能在类的内部进行调用。

(1)在类外部调用委托

image.png

(2)在类外部调用事件

image.png


事件“ClassC.Say_EventHandler”只能出现在 += 或 -= 的左边(从类型“ClassC”中使用时除外)


区别三:委托可以在外部类使用 = 来赋值,事件只能在内部类用 = 赋值,外部类不可以

image.png


从编译器提示的错误,我们可以了解到,事件只能在声明它的类内部被调用。从事件本身来讲,事件一般用于类自身的属性变化时,用来通知外界自身的变化的。我们将对ClassC内部的一个属性赋值,然后调用事件,模拟对外通知。代码如下所示

image.png


总结 🏠

事件的使用方式跟委托没什么区别,事件就相当于一个加了"event"修饰符的委托,在加了这个修饰以后,委托的部分功能就相当于被阉割了。通过这个加了修饰符以后,我们可以更好的控制注册和注销,对于一个外部类来说,它就只能通过"+=/-="注册自己和注销自己,而且外界也不能主动触发一个事件。


委托一般用于回调,而事件用于外部接口。例如在观察者模式中,在被观察者中可以声明一个事件作为外部观察者注册的接口。

同时,这个事件只能在被观察者内部触发,而观察者中无法触发该事件,从而保证了安全性。


说了这么多,总结起来就一句话:事件与委托最主要的区别应该是不能在外部调用,但可以通过+=或-=进行注册,但如果委托变量为私有,则外部不能注册;如果为公有,则外部有可以调用,破坏了封装,所以没办法,在这种情况就定义一个event就好了


相关文章
|
6天前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
1月前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
|
2月前
|
C#
C#一分钟浅谈:委托与事件的实现方式
本文详细介绍了C#编程中委托与事件的基础知识及应用场景。首先解释了委托的概念,包括定义与使用方法;接着介绍了事件这一基于委托的特殊类型,展示了如何在类中定义事件及跨类订阅与处理事件;最后讨论了常见问题如事件未处理异常、重复订阅及内存泄漏等,并提出了相应的解决方案。通过本文,读者将全面掌握委托与事件的使用技巧,提升应用程序的设计与开发水平。
116 7
|
2月前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
93 2
|
3月前
|
C#
由浅入深理解C#中的事件
由浅入深理解C#中的事件
109 19
|
3月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
79 0
|
3月前
|
存储 算法 安全
C#语言进阶(二)—事件全解
C#语言进阶(二)—事件全解
37 0
|
3月前
|
C# C++
C#语言进阶(一)—委托
C#语言进阶(一)—委托
50 0
|
3月前
|
开发框架 .NET API
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
|
16天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
29 3