首页 > 编程语言 >C#委托和事件

C#委托和事件

时间:2024-12-12 19:11:09浏览次数:4  
标签:Delegate 调用 委托 C# System delegate public 事件

C# 委托和事件

概述

委托

前提知识:

微软官方文档/C#概念/委托和事件

MulticastDelegate类

Delegate类

定义

  1. 当我们使用delegate关键字在程序中声明一个委托类型:
public delegate int Comparison<in T>(T left, T right);
  1. 编译器会在我们使用delegate关键字声明委托类型时,创建派生自System.MulticastDelegate,且与委托签名相同的类:

null

  1. System.Delegate类及其单个直接子类System.MulticastDelegate可提供框架支持,以便创建委托、将方法注册为委托目标以及调用注册为委托目标的所有方法。该委托编译后大致如下:
public class Comparsion<T> : System.MulticastDelegate
{
    // 构造函数
    public extern Comparison(object @object, IntPtr method);
    
    // 开始异步调用,返回一个表示异步操作状态的IAsyncResult对象
    public virtual extern IAsyncResult BeginInvoke(T left, T right, AsyncCallback callback, object @object);

    // 结束异步调用,并返回调用结果
    public virtual extern int EndInvoke(IAsyncResult result);

    // 同步执行调用,直接返回调用结果
    public virtual extern int Invoke(T left, T right);

}
  1. 编译器会为委托类型生成添加移除处理程序,以便可以对委托的实例添加和移除方法调用:

继承自System.MulticastDelegate类的添加方法调用

protected sealed override Delegate CombineImpl(Delegate? follow);

自称子System.MulticastDelegate类的移除方法调用

protected sealed override Delegate? RemoveImpl(Delegate value);

向委托添加调用目标

  1. 我们根据声明的委托类型Comparison声明一个委托实例comparator
public Comparison<string> comparator;
  1. 我们需要定义与委托类型签名匹配的方法CompareLength,并将它分配给委托实例comparator
private int CompareLength<string>(string left, string right)
{
    return left.Length.CompareTo(right.Length);
}

comparator = CompareLength;
  1. 调用委托:
int result = comparator("apple", "banana");
Console.WriteLine(result);

.NET Core框架提供的可重用的委托类型

Action:对任何具有void返回类型的委托都可以使用Action类型

public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

事件

标签:Delegate,调用,委托,C#,System,delegate,public,事件
From: https://www.cnblogs.com/wubing7755/p/18602249

相关文章

  • ChatGPT在功能测试用例生成方面的优势
    功能测试是软件测试的非常重要的分类,所有软件系统都要保证功能的正确性,而测试用例则是功能测试的重中之重。测试用例的编写是测试人员必须认真面对的一件耗时费力、枯燥乏味的工作。如何才能快速高效地编写测试用例且这些用例能够覆盖功能需求,一直是软件测试领域的一个重要挑......
  • 论文解读《From Generation to Judgment: Opportunities and Challenges of LLM-as-a-
    发表时间:2024期刊会议:arxiv论文单位:ArizonaStateUniversity论文作者:DaweiLi,BohanJiang,LiangjieHuang,AlimohammadBeigi,ChengshuaiZhao,ZhenTan,AmritaBhattacharjee,YuxuanJiang,CanyuChen,TianhaoWu,KaiShu,LuCheng,HuanLiu论文链接Whatis......
  • 论文阅读:Statistical Comparisons of Classifiers over Multiple Data Sets
    论文地址:StatisticalComparisonsofClassifiersoverMultipleDataSets(acm.org)前面在机器学习之Friedman检验-CSDN博客中提到了Friedman检验,这里将对这个方法的论文进行详细的阅读,以了解其原理。摘要尽管用于在单个数据集上比较两种学习算法的方法已经研究了相当......
  • EtherNet/IP转profinet网模块应用在AB罗克韦尔PLC与西门子1500PLC通讯案例
        在工业自动化领域,不同品牌的PLC(可编程逻辑控制器)之间进行通讯往往是项目实施中面临的一个重要问题。本文将详细介绍如何利用EtherNet/IP转profinet网关模块(远创智控的YC-PN-EIP)实现罗克韦尔PLC与西门子1500PLC之间稳定、高效的通讯,帮助大家在类似的项目......
  • Elasticsearch Java Api Client中DSL语句的查询方法汇总
    说明:示例代码依赖的是co.elastic.clients:elasticsearch-java:8.16.1。1、termQuery方法用途:用于精确匹配某个字段的完全相等的值。这在查询如文档的ID、状态码等具有明确取值的字段时非常有用。参数说明:field:这是一个字符串参数,用于指定要进行精确匹配查询的字段名称......
  • 面试必会(嵌入式)-C语言面试高频(内存管理)
    1.(内存)堆和栈的区别⭐堆栈空间分配不同:栈由操作系统自动进行分配和释放,用于存放函数的参数值、局部变量的值等,具有高效性。堆:一般由程序员手动进行分配和释放,效率比栈低很多。data数据区:存放全局变量,静态变量。堆栈缓存方式不同:栈使用一级缓存,存储在处理器核心中,调用完......
  • Cookie、Session、Filter过滤器
    一、Cookie####1.1工作原理客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态......
  • 利用OpenCV和Numpy实现图像校正
    实验原理图像透视变换是一种几何变换,它能够将图像中的点从一个平面映射到另一个平面,通常用于校正图像中的透视失真或者创建特殊的视觉效果。在计算机视觉和图像处理中,透视变换可以通过找到一组对应点(原图中的点和目标图中的点)并计算透视变换矩阵来实现。透视变换的关键步骤:......
  • obsidian+picgo+chevereto+picgo图床 笔记文档图片自动上传
    简介obsidian,一款知识管理工具,它支持Markdown格式,所有你的思维、笔记和灵感都能在一个地方相互连接,形成一个井然有序的知识网络。用obsidian编辑文本,图片保存本地很大,我们上传到图床,减小文件大小方便不同工具打开使用文本,减小文本空间。文档方传送迁移。obsidian安装登陆官......
  • ChatGPT 崩了!我的天塌了
    大家好,我是程序员鱼皮。今天早上,我充满干劲准备开始一天的工作,熟练地打开ChatGPT。结果没想到,ChatGPT竟然崩了!我去,天塌了?没了AI,还怎么工作啊!随后OpenAI证实了ChatGPT正经历全球范围的宕机,导致用户无法使用。这一问题也影响了iOS18.2与Siri的集成功能。Sora及AP......