【进阶】C# 委托(Delegate)知识点总结归纳

1. 委托的基本概念

  • 定义:委托是一种类型安全的函数指针,用于封装方法(静态方法或实例方法)。

  • 核心作用:允许将方法作为参数传递,实现回调机制和事件处理。

  • 类型安全:委托在编译时会检查方法签名(参数类型和返回值类型)。

2. 委托的声明与使用

  • 声明语法:

delegate [返回类型] DelegateName([参数列表]);

 示例:

delegate void MyDelegate(string message); // 无返回值,接受一个字符串参数
  • 实例化与调用
// 实例化委托(绑定方法)
MyDelegate del = new MyDelegate(MyMethod);// 调用委托
del("Hello");static void MyMethod(string msg) {Console.WriteLine(msg);
}

3. 多播委托(Multicast Delegate)

  • 特点:一个委托实例可以绑定多个方法,通过 += 和 -= 运算符管理方法链。

  • 调用顺序:按添加顺序依次执行所有方法。

  • 返回值:若委托有返回值,只有最后一个方法的返回值会被保留。

MyDelegate del1 = Method1;
MyDelegate del2 = Method2;
MyDelegate combined = del1 + del2; // 合并委托
combined("Multi-cast"); // 依次调用 Method1 和 Method2combined -= del1; // 移除委托

  • 4. 匿名方法与Lambda表达式 

  • 匿名方法(C# 2.0):无需显式定义方法,直接通过 delegate 关键字绑定。
MyDelegate del = delegate(string msg) {Console.WriteLine("Anonymous: " + msg);
};
  • Lambda表达式(C# 3.0+):简化匿名方法的语法。
MyDelegate del = (msg) => Console.WriteLine("Lambda: " + msg);

5. 内置泛型委托

  • Action:无返回值的委托,最多支持16个参数。
Action<string> action = (s) => Console.WriteLine(s);
  • Func:有返回值的委托,最后一个泛型参数为返回值类型,最多支持16个参数(不包括返回值类型)。
Func<int, int, int> add = (a, b) => a + b;
int result = add(3, 5); // 返回8
  • Predicate:返回 bool 的委托,常用于条件判断,仅支持一个参数。
Predicate<int> isEven = num => num % 2 == 0;
bool result = isEven(4); // 返回true

6. 委托与事件

  • 事件本质:事件是基于委托的封装,提供更安全的订阅/取消订阅机制。

  • 事件声明

public event EventHandler MyEvent; // EventHandler 是内置委托
  • 触发事件
MyEvent?.Invoke(this, EventArgs.Empty); // 安全调用
  • 事件与委托的区别:事件不能在类外部赋值和调用,只能在声明它的类内部触发(Invoke),外部只能订阅(+=)或取消订阅(-=)。

7. 协变与逆变(Covariance & Contravariance)

  • 协变(Covariance):允许委托返回类型是派生类(更具体类型)。(父类泛型委托装子类泛型委托)
delegate Animal GetAnimalDelegate();
GetAnimalDelegate del = GetDog; // Dog 是 Animal 的子类
Animal animal = del();static Dog GetDog() => new Dog();
  • 逆变(Contravariance):允许委托参数是基类(更通用类型)。(子类泛型委托装父类泛型委托)
delegate void ProcessDogDelegate(Dog dog);
ProcessDogDelegate del = ProcessAnimal; // 参数类型为Animal(基类)
del(new Dog());static void ProcessAnimal(Animal animal) { }

8. 注意事项

  • 内存泄漏:长期持有委托可能导致对象无法释放,需及时取消订阅(-=)。

  • 线程安全:多线程中委托调用需确保线程同步。

  • 默认值处理:调用空委托会引发异常,需判空:

del?.Invoke("Hello");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC 服务器之Janus视频会议插件信令交互

1.基础知识回顾 WebRTC 服务器之Janus概述和环境搭建-CSDN博客 WebRTC 服务器之Janus架构分析-CSDN博客 2.插件使用流程 我们要使⽤janus的功能时&#xff0c;通常要执⾏以下操作&#xff1a; 1. 在你的⽹⻚引入 Janus.js 库&#xff0c;即是包含janus.js&#xff1b; <…

Go语言中的无锁数据结构与并发效率优化

1. 引言 在高并发系统开发中&#xff0c;性能瓶颈往往出现在并发控制上。作为一个有着10年Go开发经验的后端工程师&#xff0c;我见证了无数因锁竞争导致的性能问题&#xff0c;也亲历了无锁编程为系统带来的巨大提升。 传统的锁机制就像是十字路口的红绿灯——虽然能确保安全…

STM32部分:2、环境搭建

飞书文档https://x509p6c8to.feishu.cn/wiki/DQsBw76bCiWaO4kS8TXcWDs0nAh Keil MDK用于编写代码&#xff0c;编译代码芯片支持包&#xff0c;用于支持某类芯片编程支持STM32CubeMX用于自动生成工程&#xff0c;减少手动重复工作 STM32F1系列芯片支持包 软件下载 直接下载&am…

U3D工程师简历模板

模板信息 简历范文名称&#xff1a;U3D工程师简历模板&#xff0c;所属行业&#xff1a;其他 | 职位&#xff0c;模板编号&#xff1a;B29EPQ 专业的个人简历模板&#xff0c;逻辑清晰&#xff0c;排版简洁美观&#xff0c;让你的个人简历显得更专业&#xff0c;找到好工作。…

Java设计模式: 实战案例解析

Java设计模式: 实战案例解析 在软件开发中&#xff0c;设计模式是一种用来解决特定问题的可复用解决方案。它们是经过实践验证的最佳实践&#xff0c;能够帮助开发人员设计出高质量、易于维护的代码。本文将介绍一些常见的Java设计模式&#xff0c;并通过实战案例解析它们在实际…

Vue3源码学习5-不使用 `const enum` 的原因

文章目录 前言✅ 什么是 const enum❌ 为什么 Vue 3 不使用 const enum1. &#x1f4e6; **影响构建工具兼容性**2. &#x1f501; **难以做模块间 tree-shaking**3. &#x1f9ea; **调试困难**4. &#x1f4e6; **Vue 是库&#xff0c;不掌控用户配置** ✅ 官方推荐做法&…

C++学习:六个月从基础到就业——C++11/14:lambda表达式

C学习&#xff1a;六个月从基础到就业——C11/14&#xff1a;lambda表达式 本文是我C学习之旅系列的第四十篇技术文章&#xff0c;也是第三阶段"现代C特性"的第二篇&#xff0c;主要介绍C11/14中引入的lambda表达式。查看完整系列目录了解更多内容。 引言 Lambda表达…

AIDC智算中心建设:计算力核心技术解析

目录 一、智算中心发展概览 二、计算力核心技术解析 一、智算中心发展概览 智算中心是人工智能发展的关键基础设施&#xff0c;基于人工智能计算架构&#xff0c;提供人工智能应用所需算力服务、数据服务和算法服务的算力基础设施&#xff0c;融合高性能计算设备、高速网络以…

IoTDB时序数据库V2.0.2大版本更新的一些梳理

一些小知识&#xff1a; 关于事务&#xff1a;时序数据库是没有事务的&#xff0c;它和关系数据库的应用场景不同&#xff0c;通常情况下不需要多点同时操作同一条数据&#xff0c;而且要保证极高的吐出量&#xff0c;事务太消耗资源&#xff0c;并且时序数据库提供了覆写的功能…

CSS定位详解

在前端开发中&#xff0c;CSS 定位&#xff08;positioning&#xff09;是一个核心概念&#xff0c;它决定了元素在页面上的位置和布局方式。无论是构建复杂的交互界面&#xff0c;还是实现简单的页面排版&#xff0c;CSS 定位都是不可或缺的工具。本文将全面介绍 CSS 中的五种…

React 语法扩展

useReducer钩子函数 不同action类型返回不同处理行为 useState()函数返回解构为两个值 state当前状态 dispatch修改状态函数 dispatch()函数参数为一个actuon对象 如 &#xff1a; 样例&#xff1a; import { useReducer } from react; import ./App.css;// 定义一个Reduce…

MCP协议与Dify集成教程

一、MCP协议概述 MCP&#xff08;Model Control Protocol&#xff09;是一种新兴的开放协议&#xff0c;为大型语言模型&#xff08;LLM&#xff09;与外部应用之间构建了双向通信通道。它就像是AI的"USB-C"接口&#xff0c;帮助模型发现、理解并安全调用各种外部工…

学习springboot-条件化配置@Conditional(条件注解)

前言 在Spring Boot中&#xff0c;Conditional 注解及其相关注解是用于条件化配置的重要工具。它们允许开发者根据特定条件决定是否加载某个Bean或配置类。 注意&#xff1a;Conditional 相关注解&#xff0c;通常和Bean搭配使用 学习springboot-Bean管理&#xff08;Bean 注…

2025年- H18-Lc126-54.螺旋矩阵(矩阵)---java版

1.题目描述 2.思路* 思路1&#xff1a; 补充2&#xff1a; directions[1][0] // 表示“下”这个方向的行增量&#xff08;1&#xff09; directions[1][1] // 表示“下”这个方向的列增量&#xff08;0&#xff09; int[][] directions {{0, 1}, {1, 0}, {0, -1}, {-…

微信小程序连续多个特殊字符自动换行解决方法

效果图 .wxml <view class"container"><text>没转换{{text}}</text><view style"height: 60rpx;" /><text>转换后{{convert}}</text> </view>.js Page({data: {text:&#xff01;&#xff01;&#xff01;&am…

编程速递-RAD Studio 12.3 Athens四月补丁:关注软件性能的开发者,安装此补丁十分必要

2025年4月22日&#xff0c;Embarcadero发布了针对RAD Studio 12.3、Delphi 12.3以及CBuilder 12.3的四月补丁。此更新旨在提升这些产品的质量&#xff0c;特别关注于Delphi编译器、C 64位现代工具链、RAD Studio 64位IDE及其调试器、VCL库和其他RAD Studio特性。强烈建议所有使…

Linux 进程基础(二):操作系统

目录 一、什么是操作系统&#xff1a;用户和电脑之间的「翻译官」&#x1f310; OS 的层状结构&#x1f9e9; 案例解析&#xff1a;双击鼠标的「跨层之旅」 二、操作系统的必要性探究&#xff1a;缺乏操作系统的环境面临的挑战剖析&#x1f511; OS 的「管理者」属性&#xff1…

第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题,选择题详细解释

一、选择题 第 2 题 在二维数组按行优先存储的情况下&#xff0c;元素 a[i][j] 前的元素个数计算如下&#xff1a; 1. **前面的完整行**&#xff1a;共有 i 行&#xff0c;每行 n 个元素&#xff0c;总计 i * n 个元素。 2. **当前行的前面元素**&#xff1a;在行内&#x…

1️⃣7️⃣three.js_OrbitControls相机控制器

17、相机轨道控制器 3D虚拟工厂在线体验相机轨道控制器OrbitControls 它是 Three.js 中最常用的交互控制器之一,专门用于通过鼠标/触摸控制相机围绕一个目标点(target)旋转、缩放和平移。import {OrbitControls } from three/addons/controls/OrbitControls.js; const cont…

以下是在 Ubuntu 上的几款PDF 阅读器,涵盖轻量级、功能丰富和特色工具:

默认工具&#xff1a;Evince&#xff08;GNOME 文档查看器&#xff09; 特点&#xff1a;Ubuntu 预装&#xff0c;轻量快速&#xff0c;支持基本标注和书签。 安装&#xff1a;已预装&#xff0c;或手动安装&#xff1a; sudo apt install evince功能全面&#xff1a;Okular&…