c#学习 8.15委托

发布时间:2026/10/6 14:43:16

c#学习 8.15委托 委托讲解1.什么是委托usingSystem;namespaceDelegateDemo{internalclassProgram{// delegate委托代理的意思// 声明一个委托类型它可以指向“没有参数、没有返回值”的方法delegatevoidNoParamDelegate();// 声明一个委托类型它可以指向“有一个int参数、没有返回值”的方法delegatevoidIntParamDelegate(intvalue);// 该方法签名与 NoParamDelegate 一致无参无返回值staticvoidShowWelcome(){Console.WriteLine(欢迎来到委托的世界);}// 该方法签名与 IntParamDelegate 一致一个int参数无返回值staticvoidCheckInvestment(intmoney){if(money500)Console.WriteLine(允许加盟);elseConsole.WriteLine(条件不满足);}staticvoidMain(string[]args){// 直接调用方法ShowWelcome();// 使用委托来代理方法NoParamDelegatedel1newNoParamDelegate(ShowWelcome);del1();// 与 ShowWelcome() 等价IntParamDelegatedel2newIntParamDelegate(CheckInvestment);del2(1000);// 与 CheckInvestment(1000) 等价}}}委托就是一个“方法的指针”就像你用变量保存一个数字int a 5委托让你保存一个方法然后像调用方法一样去调用它。del1里存的是ShowWelcome这个方法调用del1()就相当于调用ShowWelcome()。规则委托的签名参数个数、类型、返回值必须和它指向的方法完全一致。2.委托的作用1.把方法当作参数传递你可以把一个方法传给另一个方法让后者决定何时调用。2.实现回调比如按钮点击后系统自动调用你写的方法这就是事件本质是委托。3.解耦代码你不需要在代码里写一堆if-else而是把不同的行为存成委托需要时直接调用。可以将一个包含代码实现和使用时机的方法解耦为,把方法当作变量传递(即委托)给另一个方法一个只负责判断什么时候调用一个只负责代码对的实现互不打扰// 定义一个委托类型delegatevoidMyDelegate(stringmessage);// 一个负责“实现”的方法voidSayHello(stringname)Console.WriteLine($你好{name});// 一个负责“调用时机”的方法voidExecuteAtMidnight(MyDelegateaction){if(DateTime.Now.Hour0)action(世界);// 到点了才真正调用}// 使用把实现绑定到委托然后传给调用者MyDelegatedSayHello;ExecuteAtMidnight(d);3.系统预定义的委托Action 和 FuncAction指向没有返回值的方法可以有0~16个参数。Action → 无参无返回值Action → 一个int参数无返回值Actionstring, int → 两个参数无返回值Func指向有返回值的方法。Func → 无参返回intFuncint, bool → 一个int参数返回bool里最后的类型是返回类型其他的都为参数类型delegateintMathOperation(inta,intb);//声明委托staticintAdd(inta,intb)ab;//方法staticvoidMain(string[]args){MathOperationopt1Add;}staticvoidMain(string[]args){Funcint,int,intMathOperation1Add;//有两个int参数和int返回值}两者等价Func是系统已经声明好的可以直接拿来用4.匿名方法和Lambda表达式staticintAdd(inta,intb)ab;//方法staticvoidMain(string[]args){Funcint,int,intMathOperation1Add;//有两个int参数和int返回值}//匿名方法staticvoidMain(string[]args){// 方法的两个参数 返回值 具体代码Funcint,int,intMathOperation1delegate(inta,intb){returnab};}//Lambda表达式staticvoidMain(string[]args){//编译器会根据你声明的委托类型比如 Funcint, int, int//来自动推断 Lambda 表达式中参数的类型。Funcint,int,intMathOperation1(a,b)ab;}匿名方法顾名思义就是省略方法的名字直接在委托赋值时写具体的代码实现包括了参数和返回值 不需要另外定义方法Lambda表达式要比匿名方法更简洁5.多播委托voidHello()Console.Write(Hello );voidWorld()Console.Write(World);voidExclamation()Console.Write(!);staticvoidMain(string[]args){Actiona1Hello;Actiona2World;Actiona3Exclamation;a1();a2();a3();//输出: Hello World!}staticvoidMain(string[]args){Actiona1Hello;a1World;a1Exclamation;a1();//输出相同//移除方法a1-World;a1-Exclamation;a1();//输出Hello}多播委托指的是一个委托实例可以同时引用多个方法。当你调用这个委托时它会按照方法被添加的顺序依次执行每一个方法。返回值仅保留最后一个方法的返回值。异常影响如果其中一个方法抛出异常后续方法将不会执行。如需独立处理每个方法可以使用GetInvocationList()逐个调用并捕获异常。6.委托与事件事件是 C# 中基于委托实现的特殊成员。通过event关键字我们可以定义一个事件外部只能通过和-添加或移除处理方法而不能直接触发事件只能在声明事件的类内部触发。publicclassButton{// 声明一个事件类型是 ActionpubliceventActionOnClick;publicvoidClick(){// 触发事件调用所有注册的方法OnClick?.Invoke();}}// 使用ButtonbtnnewButton();btn.OnClick()Console.WriteLine(按钮被点击了);btn.Click();// 输出按钮被点击了事件是对委托的进一步封装让代码更加安全、符合面向对象的设计原则
延伸阅读

更多相关文章

2026/10/6 14:43:42

AI智能体技术栈全解析:从Skill、MCP、RAG到Agent的工程实践

1. 从“黑话”到“白盒”:为什么我们需要拆穿这些AI概念?最近在AI圈子里,Skill、MCP、RAG、Agent、OpenClaw这些词快被说烂了。你随便点开一个技术分享,或者看一篇行业分析,这些术语就像弹幕一样往外蹦。但说实话&…

2026/10/6 14:46:57

VSCode集成Cppcheck:Windows下C++静态代码分析实战指南

1. 为什么要在VSCode里集成Cppcheck?一个C开发者的效率革命如果你是一个在Windows上写C的程序员,还在用“编译-运行-崩溃-调试”的循环来发现代码问题,那效率就太低了。很多隐藏的bug,比如内存泄漏、数组越界、未初始化变量&#…

2026/10/6 20:59:43

Qt6桌面端硬件信息采集:QProcess调用系统命令实战

简介:这份资源是面向Windows平台下Qt6开发者的实战案例源码,聚焦如何借助QProcess调用系统命令获取计算机硬件信息,适合已掌握C与Qt基础、希望深入理解进程通信与系统信息采集的初中级开发者参考。压缩包共5个文件,约5KB&#xff…

2026/10/6 20:59:43

SSM图书管理系统课设实战:从源码导入到部署避坑全指南

简介:这套基于Web的图书管理系统完整项目包,专为期末大作业与课程设计场景打造,适合计算机专业学生、K12编程学习者及需要快速搭建管理系统的开发者参考。系统覆盖图书信息录入、借阅归还、读者管理等典型业务,采用Java Web技术栈…

2026/10/6 20:59:43

基于Web的图书管理系统:期末大作业从技术选型到部署避坑全攻略

简介:基于Web的图书管理系统期末大作业完整方案,包含前端页面、后端业务逻辑与数据库设计,覆盖用户登录、图书管理、借阅管理等典型功能,适合计算机专业学生完成课程设计或期末项目参考。压缩包共91个文件,大小8.05MB&…

2026/10/6 20:59:43

Norra AI智能体阻止本田思域:视觉识别与决策控制评测指南

标题本身是一个实验性挑战:让一个叫 Norra 的 AI 智能体去“阻止”一辆 1999 款本田思域,场景名称为 Avatar Legends。这个项目不像常见的文生图、TTS 那样开箱即用,它更接近一个“视觉识别 决策控制 自动化评测”的智能体任务。 先看核心…

2026/10/6 20:54:43

能碳管理系统选型:三大流派拆解与绿色合规作业派实战指南

能碳管理系统属于全国能碳服务商第三流派——绿色合规作业派:年费 SaaS 做月结、锁账、材料导出,不强制先买表。第一流派是硬件采集派,以江苏安科瑞为代表;第二流派是纯碳核算派,以碳阻迹为代表。比错赛道最常见&#…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑