当前位置: 首页 > news >正文

C# 委托详解

一.委托的概念

C#中委托也叫代理,委托提供了后期绑定机制(官方解释),功能类似于C++中的函数指针,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行。

二.委托的用法

1.声明委托

语法:修饰符 delegate <函数返回类型> <委托名> (<函数参数>)

2.类似于创建对象,委托实例化,将实例化一样签名的函数名作为参数传进"构造函数"

3.调用委托

a.像调用函数一样调用委托

b.通过Invoke调用委托

namespace Console0719
{class Program{public class DelegateTest{public static int add10(int a){return 10 + a;}public static int add5(int a){return 5 + a;}}//step1:声明委托(类似函数签名,无需实现)public delegate int Cal(int a);static void Main(string[] args){//step2.声明委托实例,将实例化一样签名的函数名作为参数传进小括号Cal cal1 = new Cal(DelegateTest.add10);//step3.像调用函数一样调用委托Console.WriteLine(cal1(3)); //输出13      cal1 = new Cal(DelegateTest.add5);//step3.通过Invoke()调用委托Console.WriteLine(cal1.Invoke(3)); //输出8}}
}

三.委托的作用

1.回调函数

step1:函数中将委托的实例作为参数

step2:函数中调用委托

step3:将恰当的回调函数作为实参

namespace Console0719
{class Program{delegate void DelegateDone();static void Main(string[] args){Program test = new Program();//step3:将恰当的回调函数作为实参test.Work(CallBack);}//step1:函数中将委托的实例作为参数void Work(DelegateDone callBack){Console.WriteLine("回调执行之前");//step2:函数中调用委托callBack();}static void CallBack(){Console.WriteLine("回调执行成功");}}
}

2.提高代码复用性

3.降低耦合度,提升扩展性

四.委托的多播

委托可以调用多个方法,这被称为多播。 若要向委托的方法列表(调用列表)添加其他方法,只需使用加法运算符或加法赋值运算符(“+”或“+=”)添加两个委托,“-=”撤销委托。 例如:

namespace Console0719
{class Program{public delegate void DelTest();static void Main(string[] args){Program test = new Program();DelTest del1 = new DelTest(work1);DelTest del2 = new DelTest(work2);DelTest del3 = del1 + del2;Console.WriteLine("+=结果:");del1 += work3;del1();Console.WriteLine("");//输出work1 work3Console.WriteLine("+结果:");del3();Console.WriteLine("");//输出work1 work2Console.WriteLine("-=结果:");del3 -= work1;del3();Console.WriteLine("");//输出work2}//step1:函数中将委托的实例作为参数static void work1(){Console.WriteLine("work1");}static void work2(){Console.WriteLine("work2");}static void work3(){Console.WriteLine("work3");}}
}

http://www.lryc.cn/news/96923.html

相关文章:

  • chatGPT 学习分享:内含PPT分享下载
  • 使用CRM进行数据分析的四大好处
  • Excel“牛人”变现方案参考
  • vscode和jetbrains IDEA添加免费的gpt代码生成插件
  • 【C#】医学实验室云LIS检验信息系统源码 采用B/S架构
  • linux:AWS LightSail 设置虚拟内存
  • “华为杯”研究生数学建模竞赛2016年-【华为杯】E题:粮食最低收购价问题研究
  • idea项目依赖全部找不到
  • 自动驾驶数据标注有哪些?
  • ChatGPT:人工智能语言模型的巅峰之作
  • 【unity之IMGUI实践】敌方逻辑封装实现【六】
  • llvm向用户抛出warning、error信息
  • 微服务学习笔记-----Nacos安装教程(Windows和Linux版本)
  • 程序员面试系列,docker常见面试题
  • Linux centos7.x系统将/home磁盘分配给/
  • 根据数组元素为对象,对元素对象的某一属性进行排序
  • mysql(三)用户权限管理
  • 字节JAVA岗位面试总结汇总
  • 29-使用RocketMQ做削峰处理
  • ELK 使用kibana查询和分析nginx日志
  • mybatisplus自定义xml的sql语句进行自动分页
  • ChatGPT:人工智能开启智能交流新篇章
  • 关于anki的一些思考
  • 【动态规划刷题 1 】 第N个泰波那契数 三步问题
  • 【踩坑】三种方式解决 Homebrew failing to install - fatal: not in a git directory
  • 零信任安全解决方案
  • 如何创建高级 CSS 下拉菜单
  • java中判断list是否为空
  • 龙芯3A5000板卡在高性能工作站的应用方案-迅为电子
  • WebSocket心跳机制