C#中的委托(Delegate)

news/2025/2/9 0:41:12/

什么是委托?

首先,我们要知道C#是一种强类型的编程语言,强类型的编程语言的特性,是所有的东西都是特定的类型

委托是一种存储函数的引用类型,就像我们定义的一个 string str 一样,这个 str 变量就是 string 类型. 因为C#中没有函数类型,但是可以定义一个委托类型,把这个函数赋值给这个委托

 //声明委托//delegate 返回值类型 委托的名字(方法的参数) delegate <return type> <delegate-name><parameter list>//声明一个委托,接收string参数,返回值为int类型 pubulic delegate int MyDelegate(string s)

委托一旦被声明,就可以用new关键字来创建声明委托

委托的使用

方法一:public delegate int MyDelegate(string s);internal class Program{static void Main(string[] args){MyDelegate d1 = new MyDelegate(Number);d1("11");}static int Number(string b){Console.WriteLine("你好"+b);return 1;}}方法二: public delegate int MDelegate(string a);internal class Program{static void Main(string[] args){Test.TestT(Num);}static int Num(string str){Console.WriteLine("你好"+str);return 1;}}class Test{public static void TestT(MDelegate aa){//方法接收一个委托类型的参数,就相当于接收了一个方法,该方法必须满足这个委托的规定的参数和返回值//aa 回调函数:以参数的形式传递到函数中的函数aa("12");}}

实例化委托

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 委托实例化
{delegate void Mystring(int x, string y);delegate int NumberOper(int aa, int bb);internal class Program{static void Main(string[] args){new Test();Mystring mystring=new Mystring(Fn);mystring(1, "aaa");}static void Fn(int x, string y){Console.WriteLine("Helloween");}}class Test{public Test(){string str = "2025";Mystring mystring=new Mystring(Fn);mystring(1,str);NumberOper sum = new NumberOper(Add);Console.WriteLine(Add(20,30));}void Fn(int x, string y){Console.WriteLine($"x==={x},y==={y}");}int Add(int a, int b){return a + b;}}
}

什么是多播委托?

一个委托可以引用多个方法,可以依次调用所有引用的方法。可以通过使用+运算符来合并委托或使用-运算符来移除特定的方法实现。

 delegate void MyDelegate(string name);internal class Program{static void Main(string[] args){//包含多个方法的委托,称之为多播委托MyDelegate fns = new MyDelegate(Fn1);//使用+=运算符, 再委托变量上再次添加一个方法fns += new MyDelegate(new Test().Fn2);}public static void Fn1(string a){Console.WriteLine($"这是Fn1中的a==={a}");}}class Test{public void Fn2(string x){Console.WriteLine($"这是Fn2中的a==={x}");}public static void Fn3(string x){Console.WriteLine($"这是Fn3中的a==={x}");}}

多波委托你也可以理解为捆绑事件,一个按钮绑定了多个功能

例如:

C# Winform 全选/反选(CheckBox)控件-CSDN博客


http://www.ppmy.cn/news/1570461.html

相关文章

https是如何保证安全的,又是如何保证不被中间人攻击的?

HTTPS如何保证安全&#xff0c;以及如何防止中间人攻击 保护用户隐私和数据安全已经成为了一个不可忽视的问题。随着网络攻击的不断升级&#xff0c;HTTPS&#xff08;超文本传输安全协议&#xff09;成为了我们在网络上交流时的一道重要防线。以下是HTTPS是如何保证安全的&am…

基于深度学习的药品分类编码映射系统:设计、实现与优化

一、引言 1.1 研究背景与意义 本研究的核心目标是构建一个基于深度学习的药品分类编码映射系统,以实现药品的精准分类和编码映射,大幅提高药品管理的效率和准确性。具体而言,期望该系统在处理各类药品数据时,能够达到较高的准确率,在药品实体识别任务中,将 F1 值提升至…

基于JAVA、SpringBoot和HTML游戏商城管理系统设计

摘要 本文阐述了一个基于 JAVA、Spring Boot 和 HTML 技术的游戏商城管理系统的设计。该系统旨在为游戏商城提供高效的管理解决方案&#xff0c;满足商家对游戏商品管理、用户信息管理以及订单处理等多方面的需求。利用 JAVA 语言的强大功能与稳定性&#xff0c;结合 Spring B…

如何利用Docker和.NET Core实现环境一致性、简化依赖管理、快速部署与扩展,同时提高资源利用率、确保安全性和生态系统支持

目录 1. 环境一致性 2. 简化依赖管理 3. 快速部署与扩展 4. 提高资源利用率 5. 确保安全性 6. 生态系统支持 总结 使用 Docker 和 .NET Core 结合&#xff0c;可以有效地实现环境一致性、简化依赖管理、快速部署与扩展&#xff0c;同时提高资源利用率、确保安全性和生态…

labview通过时间计数器来设定采集频率

在刚接触labview的时候&#xff0c;笔者通常用定时里的等待函数来实现指令的收发&#xff0c;但是当用到的收发消息比较多时就出现了卡顿&#xff0c;卡死的情况&#xff0c;这是因为当用队列框架时&#xff0c;程序卡在了其中的一个分支里&#xff0c;等通过相应的延时后才可以…

C++中常用的十大排序方法之1——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的相关…

JVM图文入门

往期推荐 【已解决】redisCache注解失效&#xff0c;没写cacheConfig_com.howbuy.cachemanagement.client.redisclient#incr-CSDN博客 【已解决】OSS配置问题_keyuewenhua.oss-cn-beijing.aliyuncs-CSDN博客 【排坑】云服务器docker部署前后端分离项目域名解析OSS-CSDN博客 微服…

面试题 17.19. 消失的两个数字

文章目录 1.题目2.思路3.代码 1.题目 面试题 17.19. 消失的两个数字 给定一个数组&#xff0c;包含从 1 到 N 所有的整数&#xff0c;但其中缺了两个数字。你能在 O(N) 时间内只用 O(1) 的空间找到它们吗&#xff1f; 以任意顺序返回这两个数字均可。 示例 1: **输入:** […