简单的学习一下,委托和事件

记录一下学习过程,讲的不是特别复杂属于比较基础的;根据自己现有所学的,参考一些资料写出来的可做参考,有问题可提修改意见;

C# 关于委托传送门:

C# 委托(Delegate) | 菜鸟教程 (runoob.com)icon-default.png?t=N7T8https://www.runoob.com/csharp/csharp-delegate.html参考文档 传送门:

帮你理清C#委托、事件、Action、Func - 技术专栏 - Unity官方开发者社区icon-default.png?t=N7T8https://developer.unity.cn/projects/602603cbedbc2a0020405f83如何使用 C# 中的 Action, Func,Predicate - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/338916664

目录

委托

1. 委托的定义和语法

2. 委托的使用

事件

1、事件的本质:

2、事件源(Publisher)和事件订阅者(Subscriber):

3、事件的声明和使用:

4、优点和应用场景:

事件和委托的区别

(1)、概念和用途:

(2)、使用方式:

(3)、安全性和封装:

(4)、适用场景:


委托

委托其实是一种类型,用于引用一个或多个方法,使得这些方法可以像数据一样被操作、传递和调用。委托允许将方法作为参数传递给其他方法,或者允许在运行时动态地添加、移除方法引用。这使得委托在事件处理、回调机制、LINQ查询等方面非常有用。

(1)、委托是函数/方法的容器: 委托是一种引用类型,它可以持有对一个或多个方法的引用。这使得可以通过委托间接调用这些方法。

(2)、表示函数/方法的变量类型: 委托定义了方法的签名(返回类型和参数类型),因此可以声明委托类型的变量来存储特定签名的方法引用。

(3)、传递函数/方法: 委托允许将方法作为参数传递给其他方法,或者将方法赋值给委托变量,从而可以在运行时动态确定调用哪个方法。

(4)、不同函数/方法必须对应格式一致的委托: 委托在声明时指定了方法的签名,因此只能引用具有相同签名(返回类型和参数类型一致)的方法。

(5)、委托的本质是一个类: 委托在 C# 中被实现为一个类,它继承自 System.Delegate 类。这个类中包含了对一个或多个方法的引用。

1. 委托的定义和语法

在C#中,委托通过 delegate 关键字定义。委托定义了方法的签名,允许将这种签名匹配的任何方法绑定到委托上。

delegate void MyDelegate(string message);

上面的代码定义了一个委托 MyDelegate,它可以引用一个接受 string 参数并返回 void 的方法

委托是支持 泛型的 可以让返回值和参数 可变 更方便我们的使用

2. 委托的使用

2.1 声明委托实例

可以通过声明委托类型的实例来创建委托对象,可以把它想象成一种可以存储方法引用的变量。

MyDelegate handler;

2.2 绑定方法到委托

使用委托实例来引用一个或多个方法。这些方法必须与委托的签名兼容。

void MethodA(string message)
{
    Console.WriteLine("Method A: " + message);
}

void MethodB(string message)
{
    Console.WriteLine("Method B: " + message);
}

// 绑定 MethodA 和 MethodB 到委托实例
handler = MethodA;
handler += MethodB;

2.3 调用委托

通过调用委托实例来间接调用其引用的方法

handler("我正在调用委托");

在这个示例中,调用 handler("我正在调用委托") 会依次调用 MethodA("我正在调用委托")MethodB("我正在调用委托"),并将输出打印到控制台上。

3. 委托的优势和应用场景

  • 事件处理: 委托允许事件与事件处理器的解耦,实现了观察者设计模式,使得事件的发布者不需要关心哪些方法会响应事件。

  • 回调方法: 委托使得在异步操作完成时执行回调方法变得简单,允许更高效的异步编程模型。

  • 动态方法调用: 可以根据运行时的需要来动态选择和调用方法,增加了代码的灵活性和可扩展性。

  • LINQ 查询: LINQ(Language Integrated Query)使用委托来对集合进行查询和筛选,使得数据操作更加简洁和灵活。

简单总结一下:委托是C#中重要的功能之一,它允许将方法视为第一类对象来操作,这种特性在许多现代编程模式和框架中得到广泛应用。通过委托,开发人员可以实现更为灵活和可维护的代码结构,尤其在事件驱动和异步编程方面尤为突出。

事件

允许类或对象通知其他类或对象某个发生的动作或状态变化。事件常用于实现基于观察者模式(Observer Pattern)的设计,其中一个对象(事件源)发出事件,而一个或多个其他对象(事件监听器或订阅者)通过订阅事件来响应这些事件。

1、事件的本质

(1)、事件是建立在委托的基础之上的,事件声明时使用的委托类型定义了可以被触发的事件处理方法的格式。

(2)、件使用委托来实现其底层机制,但更确切地说,事件提供了一种限制访问委托的方式,使其只能通过 += 和 -= 运算符来订阅和取消订阅。这种限制使得事件的使用更加安全和易于控制。

(3)、事件 通过封装委托的订阅和取消订阅过程来提供更安全的访问。它可以防止未经授权的代码直接调用委托,并且使得事件只能在定义了事件的类内部触发。

2、事件源(Publisher)和事件订阅者(Subscriber)

  • 事件源是声明和引发事件的类或对象。
  • 事件订阅者是处理事件的类或对象,它们通过订阅事件来接收和响应事件触发时的通知。

3、事件的声明和使用:

声明事件:在类中声明事件时,使用 event 关键字和委托类型来定义事件

这里的 EventHandler 是一个委托类型,用于引用事件处理方法。

public event EventHandler MyEvent;

触发事件:在事件源类中,通过调用事件触发方法来引发事件,通常使用 protected virtual 方法来保护事件的触发过程。

protected virtual void OnMyEvent(EventArgs e)
{
    MyEvent?.Invoke(this, e);
}

订阅事件:在订阅者类中,通过将事件处理方法添加到事件的调用列表中来订阅事件。

eventSource.MyEvent += HandleMyEvent;

处理事件:事件发生时,订阅者中的事件处理方法将被调用,执行相应的逻辑

void HandleMyEvent(object sender, EventArgs e)
{
    // 处理事件的逻辑
}

4、优点和应用场景

  • 解耦:事件允许对象之间松散耦合,事件源不需要知道具体哪些对象在处理事件。
  • 扩展性:支持多个订阅者,便于扩展和维护。
  • 异步通知:适用于异步编程模型,让事件处理与业务逻辑分离,提高程序的响应性和并发性

事件和委托的区别

(1)、概念和用途

  • 委托:委托是一种类型安全的引用,用于封装方法。它允许将方法作为参数传递给其他方法,或者存储和调用一组方法。委托允许类似于函数指针的功能,但在C#中更加类型安全和面向对象。
  • 事件:事件是委托的一种特殊应用,用于实现发布-订阅模型。事件提供了一种通知机制,允许对象通知其他对象发生了特定的动作或状态改变。通过事件,一个对象(事件源)可以告知其他对象(事件订阅者)已经发生了某个行为或状态。

(2)、使用方式

  • 委托:委托可以直接通过实例化委托类型并调用其方法来使用,也可以通过 += 和 -= 运算符来添加和移除方法引用。
  • 事件:事件(Event)本质上是委托(Delegate)的一种特殊用法。在C#中,事件通过声明一个委托类型的变量,然后使用 event 关键字来创建。这样做的目的是为了限制对委托调用列表的访问,只允许外部代码订阅(使用 +=)和取消订阅(使用 -=)事件,而不允许直接调用委托或修改调用列表。

(3)、安全性和封装

  • 委托:委托的调用列表可以被外部直接访问和修改,因此需要在使用时谨慎处理以确保类型安全和代码健壮性。
  • 事件:事件封装了委托的调用过程,外部代码不能直接调用或修改事件的触发逻辑,只能通过提供的订阅和取消订阅方法来操作事件。

(4)、适用场景

  • 委托:适合在需要将方法作为参数传递或需要多播委托(即一个委托可以引用多个方法)的场景中使用。
  • 事件:适合实现发布-订阅模式,特别是在GUI编程、多线程编程、异步编程等需要对象之间解耦的情况下。

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值