C#委托的概念与使用方法
一、委托的基本概念
-
委托是一种引用类型,它允许将方法作为参数进行传递。简单来说,委托就像是对方法的引用,可以通过委托来调用对应的方法。
-
委托具有类型安全性,它会检查方法的签名是否与委托的签名匹配,这有助于避免类型不匹配的错误。
二、委托的声明与使用
-
声明委托 :使用
delegate
关键字来声明一个委托,其语法形式为:[访问修饰符] delegate 返回类型 委托名 (参数列表);
。例如:public delegate int MyDelegate(int x, int y);
,这表示声明了一个名为MyDelegate
的委托,它接受两个整型参数,并返回一个整型值。 -
实例化委托 :要使用委托,首先需要实例化它。实例化委托时需要指定一个与委托签名匹配的方法。例如:
public class Program {public static int Add(int a, int b){return a + b;}static void Main(string[] args){MyDelegate myDelegate = new MyDelegate(Add);int result = myDelegate(2, 3);Console.WriteLine(result); // 输出 5} }
在这个例子中,我们声明了一个委托
MyDelegate
,然后定义了一个与委托签名匹配的方法Add
。在Main
方法中,我们实例化了委托myDelegate
,并将其指向Add
方法,最后通过委托调用了Add
方法。 -
匿名方法 :在实例化委托时,还可以使用匿名方法,即无需事先定义一个方法,而是在实例化委托时直接定义方法体。例如:
MyDelegate myDelegate = delegate(int x, int y) { return x + y; };
这种方式可以在某些简单场景下简化代码。 -
lambda 表达式 :lambda 表达式是匿名方法的更简洁的表示形式,它在语法上更加简洁直观。例如:
MyDelegate myDelegate = (x, y) => x + y;
这里的(x, y) => x + y
就是一个 lambda 表达式,它表示接受两个参数x
和y
,并返回它们的和。
三、系统委托
-
Action 委托 :
System.Action
是一个无返回值的委托。它可以用于表示不返回任何结果的方法。例如:Action<string> printAction = s => Console.WriteLine(s); printAction("Hello, World!");
这个例子中,
Action<string>
表示一个接受一个字符串参数且无返回值的委托。我们通过 lambda 表达式定义了printAction
委托,使其将接收到的字符串打印到控制台。 -
Func 委托 :
System.Func
是一个有返回值的委托。它可以用于表示返回特定类型结果的方法。例如:Func<int, int, int> addFunc = (a, b) => a + b; int result = addFunc(2, 3); Console.WriteLine(result); // 输出 5
-
Predicate 委托 :
System.Predicate
是一个返回布尔值的委托。它通常用于表示判断条件的方法。例如:List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; Predicate<int> isEven = n => n % 2 == 0; List<int> evenNumbers = numbers.FindAll(isEven); foreach (int num in evenNumbers) {Console.WriteLine(num); // 输出 2 和 4 }
在这个例子中,
Predicate<int>
表示一个接受一个整型参数并返回一个布尔值的委托。我们通过 lambda 表达式定义了isEven
委托,使其判断一个整数是否为偶数。然后使用FindAll
方法将列表中满足条件的元素筛选出来。
四、事件委托
-
概念 :事件是基于委托的一种特殊应用,用于在对象之间传递消息。事件委托是定义事件的基础,它规定了事件处理程序的方法签名。
-
声明事件委托 :通常,事件委托的声明需要结合特定的参数类型,如
EventArgs
及其派生类。例如:public delegate void EventHandler(object sender, EventArgs e);
这是 .NET 中一个常见的事件委托声明,其中sender
表示事件源,e
包含事件相关的数据。 -
声明事件 :在类中使用
event
关键字来声明事件。例如:public class Button {public event EventHandler Click;// 其他代码 }
在这个例子中,
Button
类声明了一个名为Click
的事件,它基于EventHandler
委托。
-
引发事件 :在适当的时候(如用户点击按钮时),调用事件来通知订阅者。在引发事件时,通常需要创建一个事件数据对象作为参数传递。例如:
protected virtual void OnClick(EventArgs e)
{Click?.Invoke(this, e);
}
OnClick
方法用于引发 Click
事件。使用 Click?.Invoke(this, e);
的方式可以安全地调用事件,避免事件为 null
时引发异常。
-
订阅事件 :其他对象可以通过注册事件处理程序来订阅事件。例如:
Button button = new Button(); button.Click += Button_Click;void Button_Click(object sender, EventArgs e) {// 处理按钮点击事件的逻辑 }
在这段代码中,我们创建了一个
Button
对象,并通过+=
运算符将Button_Click
方法订阅到Click
事件上。当按钮被点击时,Button_Click
方法将被调用。 -
解除订阅 :在不需要再接收事件通知时,可以使用
-=
运算符来解除订阅。例如:button.Click -= Button_Click;
。
五、委托的多播
-
概念 :委托可以将多个方法组合在一起,形成一个调用链,这就是委托的多播特性。当调用多播委托时,它会按照添加的顺序依次调用所有组合的方法。
-
示例 :
public class Program {public static void Method1(){Console.WriteLine("Method1 called");}public static void Method2(){Console.WriteLine("Method2 called");}static void Main(string[] args){Action action1 = Method1;Action action2 = Method2;Action multiCastDelegate = action1 + action2;multiCastDelegate();// 输出:// Method1 called// Method2 called} }
在这个例子中,我们创建了两个
Action
委托action1
和action2
,它们分别指向Method1
和Method2
方法。然后通过+
运算符将它们组合成一个多播委托multiCastDelegate
。当调用multiCastDelegate
时,Method1
和Method2
会依次被执行。
六、总结
C# 中的委托是一种强大的机制,它允许将方法作为参数进行传递,并且具有类型安全性。系统委托如 Action
、Func
和 Predicate
提供了方便的预定义委托类型,可以用于各种常见的场景。事件委托则是委托在事件驱动编程中的特殊应用,用于解耦事件源和事件处理者。委托的多播特性使得可以将多个方法组合在一起形成调用链,提供了更大的灵活性。
通过合理使用委托,可以使代码更加模块化、灵活和可维护。
相关文章:
C#委托的概念与使用方法
一、委托的基本概念 委托是一种引用类型,它允许将方法作为参数进行传递。简单来说,委托就像是对方法的引用,可以通过委托来调用对应的方法。 委托具有类型安全性,它会检查方法的签名是否与委托的签名匹配,这有助于避免…...

消费者行为变革下开源AI智能名片与链动2+1模式S2B2C商城小程序的协同创新路径
摘要:在信息爆炸与消费理性化趋势下,消费者从被动接受转向主动筛选,企业营销模式面临重构挑战。本文提出开源AI智能名片与链动21模式S2B2C商城小程序的协同创新框架,通过AI驱动的精准触达、链动裂变机制与S2B2C生态赋能࿰…...

软考 系统架构设计师系列知识点之杂项集萃(78)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(77) 第139题 以下关于软件测试工具的叙述,错误的是()。 A. 静态测试工具可用于对软件需求、结构设计、详细设计和代码进行评审、走查和审查 B. 静…...
解决MyBatis参数绑定中参数名不一致导致的错误问题
前言 作为一名Java开发者,我在实际项目中曾多次遇到MyBatis参数绑定的问题。其中最常见的一种情况是:在Mapper接口中定义的参数名与XML映射文件中的占位符名称不一致,导致运行时抛出Parameter xxx not found类异常。这类问题看似简单&#x…...

如何解决MySQL Workbench中的错误Error Code: 1175
错误描述: 在MySQL Workbench8.0中练习SQL语句时,执行一条update语句,总是提示如下错误: Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY columnTo disab…...

Docker 镜像(或 Docker 容器)中查找文件命令
在 Docker 镜像(或 Docker 容器)中运行如下两个命令时: cd / find . -name generate.py它们的含义如下,我们来一行一行详细拆解,并结合例子讲解: ✅ 第一行:cd / ✅ 含义 cd 是“change dire…...

MySQL进阶篇(存储引擎、索引、视图、SQL性能优化、存储过程、触发器、锁)
MySQL进阶篇 存储引擎篇MySQL体系结构存储引擎简介常用存储引擎简介存储引擎的选择 索引篇索引简介索引结构(1)BTree索引(2)hash索引 索引分类索引语法SQL性能分析指标(1)SQL执行频率(2)慢查询日志(3)profile详情(4)explain或desc执行计划 索引使用引起索引的失效行为SQL提示覆…...
python批量解析提取word内容到excel
# 基于Python实现Word文档内容批量提取与Excel自动化存储 ## 引言 在日常办公场景中,常需要从大量Word文档中提取结构化数据并整理到Excel表格中。传统手动操作效率低下,本文介绍如何通过Python实现自动化批处理,使用python-docx和openpyxl…...

BugKu Web渗透之game1
启动场景,打开网页如下: 是一个游戏。 步骤一: 右键查看源代码也没有发现异常。 步骤二: 点击开始游戏来看看。 结果他是这种搭高楼的游戏。我玩了一下子,玩到350分就game over。 之后就显示游戏结束,如…...
使用Composer创建公共类库
概述 如果多个项目中存在使用相同类库、模块的情况,此时可以考虑将类库或者模块单独抽取出来,形成独立类库,通过composer 来进行依赖管理,这样可以更方便维护,大大提升开发效率。 优势 可以对特定模块进行统一维护和…...

Axure设计案例——科技感渐变柱状图
想让你的数据展示瞬间脱颖而出,成为众人瞩目的焦点吗?快来看看这个 Axure 设计的科技感渐变柱状图案例!科技感设计风格以炫酷的渐变色彩打破传统柱状图的单调,营造出一种令人惊叹的视觉盛宴。每一个柱状体都仿佛蕴含着无限能量&am…...
LeetCode 热题 100 394. 字符串解码
LeetCode 热题 100 | 394. 字符串解码 大家好!今天我们来探讨一道非常有趣的算法题目——LeetCode 394. 字符串解码。这道题考察了我们对栈这种数据结构的理解和应用能力,同时也涉及到了字符串的处理技巧。接下来,我将详细地为大家解析这道题…...

互联网大厂智能体平台体验笔记字节扣子罗盘、阿里云百炼、百度千帆 、腾讯元器、TI-ONE平台、云智能体开发平台
互联网大厂 字节扣子、阿里云百炼、百度千帆 、腾讯元器、TI-ONE平台、云智能体开发平台 体验 开始动手 了解 智能体,发现已经落后时代太远 光头部互联网大厂对开 公开的平台就已经这么多,可以学习和了解,相关的信息 整理了对应的平台地址…...

深入解析ReactJS中JSX的底层工作原理
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
亡羊补牢与持续改进 - SRE 的安全日志、审计与事件响应
亡羊补牢与持续改进 - SRE 的安全日志、审计与事件响应 如果说我们之前讨论的安全措施(如 IAM、网络策略、密钥管理、漏洞补丁)是为我们的“数字城堡”修筑坚固的城墙、设置精密的门锁、定期检查和修补潜在的裂缝,那么安全日志就像是遍布城堡内外的监控摄像头和出入登记簿,…...

NodeMediaEdge任务管理
NodeMediaEdge任务管理 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中,拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 在未使用NodeMediaServer的情况下,或是对部分视频流需要单独推送的需求,也可…...
LIMIT 和 OFFSET 在大数据量下的性能问题分析与优化方案
LIMIT 和 OFFSET 在大数据量下的性能问题分析与优化方案 一、基础概念与工作原理 1.1 LIMIT/OFFSET 语法解析 LIMIT和OFFSET是SQL中用于分页查询的关键子句: Ai专栏:https://duoke360.com/tutorial/path/ai-lm SELECT * FROM large_table ORDER BY id LIMIT 10 OFFSET 1…...

SpringBoot集成第三方jar的完整指南
原文地址:https://blog.csdn.net/weixin_43826336/article/details/141640152?ops_request_misc%257B%2522request%255Fid%2522%253A%25227d4118ef2d572ba4428caf83f1d2bb28%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id7d4118…...
登高架设作业实操考试需要注意哪些安全细节?
在登高架设作业实操考试中,安全细节是考官重点考察的内容,任何疏忽都可能导致扣分甚至直接判定不合格。以下是必须注意的关键安全细节,按考试流程分类整理: 一、个人防护装备(PPE)检查与穿戴 安全带 必须…...

前端基础之《Vue(18)—路由知识点》
一、两种路由模式 1、hash路由 (1)url中有#号,背后是监听onhashchange事件 (2)hash路由部署上线不会出现404问题,背后是基于history api实现的 2、history路由 (1)url中没有#号 &a…...

014校园管理系统技术解析:构建智慧校园管理平台
校园管理系统技术解析:构建智慧校园管理平台 在教育信息化快速发展的当下,校园管理系统成为提升学校管理效率、优化校园服务的重要工具。该系统集成院校管理、投票管理等多个核心模块,面向管理员、用户和院内管理员三种角色,通过…...
微服务各个部分的作用
微服务架构将复杂应用拆分为多个独立、可部署的小型服务,每个服务实现特定业务功能。以下是微服务架构中核心组成部分及其作用: 一、服务层(微服务本身) 作用: 实现独立业务逻辑:每个微服务专注于单一业…...

SQLite详细解读
一、SQLite 是什么? SQLite 是一个嵌入式关系型数据库管理系统(RDBMS)。它不是像 MySQL 或 PostgreSQL 那样的客户端-服务器数据库引擎,而是一个自包含的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 核心特点 嵌入式/库…...

LRC and VIP
//首先排除所有数相等的情况,再把最大值放在一个组,那么最大值的gcd就等于其本身,再判断剩下的gcd是否等于最大值就可以了 #include<bits/stdc.h> using namespace std;const int N1e3100; int a[N]; map<int,int>mapp; int main(){int t;ci…...

Python趣学篇:Pygame重现经典打砖块游戏
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《Python星球日记》 目录 一、游戏背景与技术选型1. 打砖块游戏…...
电脑硬盘分几个区好
分区的基本概念和作用 在探讨分几个区合适之前,咱们先了解一下硬盘分区是啥。简单来说,硬盘分区就像是把一个大房子隔成几个小房间,每个房间可以用来存放不同类型的东西。分区能让我们更有条理地管理文件,比如把系统文件、工作资…...
Vue3 + Element Plus + TypeScript 中 el-cascader 实现模拟用户点击功能
模拟点击,调用 el-cascader 的公开方法 togglePopperVisible 来展开下拉框 MaterialOut.vue <script setup lang"ts" name"MaterialOut"> ...... import { ElMessage, type ElCascader } from "element-plus";// 级联组件实例…...
【java】springboot注解关键字
springboot注解关键字 ValueServiceRepositoryConfigurationControllerComponent Value Value 是 Spring Boot 中用于注入外部配置的注解,它允许你将配置文件(如 application.properties 或 application.yml)中的值注入到 Bean 的字段、方法…...
supervisor 常见问题大全
写在前面 Supervisor 是一个用 Python 开发的进程管理工具,常用于服务器环境下的进程监控和管理。在日常使用过程中,我们经常会遇到各种配置、运行和日志相关的问题。 本文将汇总记录我在实际工作中使用 Supervisor 时遇到的各种典型问题及其解决方案。…...
2024 CKA模拟系统制作 | Step-By-Step | 18、题目搭建-备份还原Etcd
目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. etcd 快照创建 2. etcd 快照还原 3. TLS 证书管理 4、关键参数 三、实验环境搭建步骤 1.创建题目要求目录 2.证书准备 3.创建考试中需要还原的备份数据 四、总结 免费获取题库配套 CKA_v1.31_模…...