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

C# 委托 (delegate)

委托

委托概念:

委托是引用类型,也可以自定义类型;

换个概念:A委托B去做一件事。站在A的角度,A委托了B,站在B的角度,B是A的代理。

C#语言中的委托比较抽象:委托指向一系列具有相同签名和返回类型的方法的地址。

总结:委托是一系列方法地址的引用,委托就代理了一系列的方法。调用委托就相当于调用这一系列方法。

委托定义:

使用delegate关键字

在类内部可以定义,在类外部也可以,在方法中不能定义

 internal class Program{//定义委托,观察一下:委托和方法的形式的区别:a.没有方法体 b.多个delegate关键字。//可以没有返回,可以没有参数。public delegate void SayHello();public delegate bool Delegate1(string arg);
}

调用/使用委托:   

方法:返回值类型 返回值变量 = 方法名(形参列表):

委托不能像方法那样直接调用,委托没有方法体,委托必须代理某个方法

委托实例名直接调用。如:
SayHello sayChinese = new SayHello(SayChinese);
sayChinese();

Inovke执行委托
​ 如果委托定义没有参数,则Inovke也没有参数;委托没有返回值,则Inovke也没有返回值

BeginInvoke开启一个新线程执行委托
​NetCore不支持,NetFamework支持 NetCore有更好的多线程功能来支持实现类似功能

EndInvoke等待BeginInvoke执行完成后再执行

实例化委托

通过new来实例化

public delegate void SayHello();
public delegate bool Delegate2(string arg);
static void Main(string[] args)
{// a. 实例化(让某个委托类型去代理一系列方法地址)  C# 1.0写法 SayHello sayHello1 = new SayHello(Method1);// 实例化有一种简写,只要方法满足委托的,就可以直接赋值给委托ayHello sayHello2 = Method2;  // 推荐sayHello1();//调用委托,相当于访问了Method1()sayHello2();//调用委托,相当于访问了Method2()
}public static void Method1(){Console.WriteLine("方法1");}public static void Method2(){Console.WriteLine("方法2");}

直接=一个方法,这个是编译器提供的语法糖

static void Main(string[] args)
{// 多播委托:一个委托实例,同时代理多个方法地址。// 多播委托:// 语法细节,第一次代理时,不能使用+=,第二次及之后,需要使用+=运算符重载。// 注意调用时,执行顺序。delegate = Method4;//delegate = Method3;// 重新赋值,把原来值替换。不叫多播委托。delegate -= Method4;delegate += Method3;// ......
}public static bool Method3(string arg){Console.WriteLine("方法3");return arg == "hello";}public static bool Method4(string arg){Console.WriteLine("方法4");return true;}

直接=一个匿名委托

static void Main(string[] args)
{// 使用匿名委托进行实例化,匿名委托本质就是匿名方法(匿名函数:没有名称方法) C# 2.0 写法           Delegate2 delegate2 = Method3;// 代理非匿名方法
}private static bool Method3(string arg){throw new NotImplementedException();}

直接=一个Lambda

public delegate string Delegate3(int a, int b);
internal class Program
{static void Main(string[] args){// 通过拉姆达实例化委托   C# 3.0 写法Delegate3 delegate1 = Method5;Delegate3 delegate2 = (int a, int b) =>{return (a - b).ToString();};}public static string Method5(int a, int b){return (a + b).ToString();}
}

委托的本质:

委托其实是将一个方法作为参数传递给另一个方法。(委托可以充当方法的回调函数的类型)

委托是方法的引用。(即委托是方法的代理)

委托可以引用多个方法。(如:多播委托)

C#中常用的委托

常见委托:Action,Action<T>,Func<T>,Predicate<T>,Converter<T1,T2>,EventHandler

Action:public delegate void Action();  表示是一个没有形参,且没有返回值的委托

Action<T1,T2,....>:public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);  表示是有多个不定形参,且没有返回值的委托

Func<out TResult>:public delegate TResult Func<out TResult>(); 表示没有形参,有一个返回值TResult的委托

Func<in T1,in T2,...,out TResult>:public delegate TResult Func<in T, out TResult>(T arg);  表示有多个不定形参,且有一个返回值TResult的委托。

Predicate<in T>: public delegate bool Predicate<in T>(T obj); 表示拥有一个参数,且返回值是bool的委托。

多播委托

委托是一系列方法的引用,调用委托时,可以同时执行多个方法。
多播委托,就是用一个委托代理多个方法,调用委托时,可以执行多个方法。
多播委托的本质是运算符重载 += 、 -=
多播委托好处:广播事件(多次绑定事件,或者说绑定多个事件)

语法细节,第一次代理时,不能使用+=,第二次及之后,需要使用+=运算符重载。注意调用时,执行顺序。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Unity 中创建动画的教程
  • MNN部署、集成
  • ZLMediaKit编译webrtc
  • ogg格式如何转换成MP3?这6个方法真心不错
  • 红酒与户外探险:探险途中的很好伴侣
  • Java使用MQTT协议
  • 哈希表 242.有效的字母异位词
  • 【leetcode图文详解】特殊数组II : 空间换时间的“记忆化”,越多越好吗?
  • 24暑假算法刷题 | Day30 | 贪心算法 IV | LeetCode 452. 用最少数量的箭引爆气球,435. 无重叠区间,763. 划分字母区间
  • 常用的麦克劳林级数展开式(泰勒展开式)
  • MapReduce 简单介绍
  • Vue3的多种组件通信方式
  • 解决C++读写中文乱码问题, UTF-8与GBK字符的转换 —基于Windows.h
  • RAR文件密码忘记怎么办?三大RAR密码找回工具推荐
  • 苹果macOS 15 Sequoia投屏功能 实现Mac上iPhone桌面管理
  • android 一些 utils
  • CentOS 7 防火墙操作
  • CSS 专业技巧
  • express + mock 让前后台并行开发
  • Facebook AccountKit 接入的坑点
  • java8-模拟hadoop
  • Phpstorm怎样批量删除空行?
  • Python十分钟制作属于你自己的个性logo
  • spark本地环境的搭建到运行第一个spark程序
  • SQLServer之创建数据库快照
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • kubernetes资源对象--ingress
  • 阿里云ACE认证之理解CDN技术
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (2022 CVPR) Unbiased Teacher v2
  • (4.10~4.16)
  • (52)只出现一次的数字III
  • (Forward) Music Player: From UI Proposal to Code
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)德国人的记事本
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .Net Core 中间件与过滤器
  • .NET/C# 的字符串暂存池
  • .net项目IIS、VS 附加进程调试
  • @AliasFor注解
  • @Controller和@RestController的区别?
  • @EnableWebSecurity 注解的用途及适用场景
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [20170705]lsnrctl status LISTENER_SCAN1