C# 委托(delegate)本质理解
代码如下,很简单
namespace Delegate
{
class Program
{
delegate void SayHi();
void SayHi_1()
{
Console.WriteLine("SayHi_1");
}
static void Main(string[] args)
{
Program p = new Program();
SayHi sh = new SayHi(p.SayHi_1);
sh.Invoke();
Console.Read();
}
}
}
运行的结果
反编译程序查看
关注两点:
1、委托反编译过后是一个类。
2、有一个Invoke方法。
我们对类应该玩的非常熟练了吧,一般套路 :用类new 实例对象——>调用方法。
委托也一样
SayHi sh = new SayHi(p.SayHi_1);//new 实例对象
sh.Invoke();//调用方法
什么是委托
IL层面
1、委托的本质就是一个类
2、继承自System.MulticastDelegate
3、委托里面内置了3个方法:Invoke(),BeginInvoke(),EndInvoke()。
委托的三个步骤
1、delegate void SayHi();//1.委托的声明
2、SayHi sh = new SayHi(p.SayHi_1)//2.委托的实例化(构造函数传方法)
3、sh.Invoke();//3.实例调用(Invok调用),这里等于执行了这个方法
sh ();//直接调用和上面一行代码是一样的
委托的意义
1、解耦:
好处是减少重复代码;
解耦是解除了判断逻辑和共用逻辑之间的耦合;
委托传递的是逻辑(逻辑就是方法);
2、异步多线程
3、多播委托
+=为委托实例按顺序增加方法,形成方法链,Invok()时按顺序执行
-=为委托实例移除方法,从方法链的尾部开始匹配,遇到第一个完全吻合的移除,且只移除一个;没有的也不异常
多播委托带返回值,结果以最后的为准
价值:一个变量保存多个方法,可以增减方法;Invok时候可顺序执行
C# 委托(delegate)本质理解的更多相关文章
- 理解委托(delegate)及为什么要使用委托
理解委托(delegate)及为什么要使用委托 委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来 ...
- 深入理解委托(Delegate)
前言 委托其实一直以来都感觉自己应该挺熟悉的,直到最近又去翻了翻 CLR via C#,感觉我之前的理解可能还有失偏颇.在这记录一下. 之前文章的链接: 接口和委托的泛型可变性 C#高级编程笔记 De ...
- C# Note2:委托(delegate) & Lambda表达式 & 事件(event)
前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...
- Atitit. 委托的本质 c#.net java php的比较
Atitit.class 与type的区别,抽象的级别 class, delegate,interface委托的本质 1. 委托是粒度更细的接口 1 2. 委托模式 1 3. Java中的委托 1 4 ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
- C# 委托Delegate(一) 基础介绍&用法
本文是根据书本&网络 前人总结的. 1. 前言 定义&介绍: 委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的 ...
- 为什么不能把委托(delegate)放在一个接口(interface)当中?
stackoverflow上有人问,为什么不能把委托放在一个接口当中? 投票最多的第一个答案第一句话说,“A Delegate is just another type, so you don't g ...
- C#委托零基础理解
C#委托零基础理解(转) 1, 为什么使用委托 2.什么是委托 3.委托如何使用 为什么使用委托? 委托是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内.然后可以将该委 ...
- c# 委托 delegate
委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法. ...
- 关于C# 委托(delegate)与事件(event)的用法及事例
C#中的委托和事件对于新手可能会有一点难理解,所以先从一个小例子入手,以便能更好的理解其如何使用.有一个学生每天定闹钟在早上6点起床,所以当每天早上6点的时候,闹钟就会响起来,从而学生才会按时起床. ...
随机推荐
- 最好的PDF文本编辑开发库
PDF文件是一种常见的文档格式,它具有跨平台.保持原样.安全性高等特点.但是,PDF文件也有一个缺点,就是不可编辑.如果我们想要修改PDF文件中的内容,比如文字.图片.表格等,就会很麻烦,需要转档为W ...
- 探索AI视频生成新纪元:文生视频Sora VS RunwayML、Pika及StableVideo——谁将引领未来
探索AI视频生成新纪元:文生视频Sora VS RunwayML.Pika及StableVideo--谁将引领未来 由于在AI生成视频的时长上成功突破到一分钟,再加上演示视频的高度逼真和高质量,Sor ...
- 使用JS保存数据
1 保存到text中 demo1.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...
- SpringBoot相关注解使用
@MapperScan注解和@Mapper @Mapper常用在相应的 *Mapper类上,但是每个类都使用相对麻烦,所以后来用@MapperScan替代 ,@MapperScan注解使用在启动类上. ...
- 在PL/SQL中使用日期类型
在PL/SQL中使用日期类型 之前的文章介绍了在PL/SQL中使用字符串和数字了下.毫无疑问,字符串和数字很重要,但是可以确定的是没有哪个应用不依赖于日期的. 你需要记录事件的发生事件,人们的出生日期 ...
- itext 生成 PDF
itext 生成 PDF(一) 转自:https://blog.csdn.net/lcczpp/article/details/125424395 itext生成PDF excel 示例 转自: ...
- 文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具
前言 在做到个别项目对日志要求较高,要求并行写入的数据较多,尽管写入数据的线程放在子线程,仍然会造成界面程序的假死(实际上Qt还是在跑,只是磁盘消耗超过瓶颈,造成假死(注意:控制台还能看到打印输出 ...
- ChainMap合并字典
在python中,我们有两个字典需要合并的时候,可以使用字典的update方法 a = {'a': 1, 'b': 2} b = {'x': 3, 'y': 4} a.update(b) print( ...
- SwitUI初次体验
序言 开年的第一篇文章,今天分享的是SwiftUI,SwiftUI出来好几年,之前一直没学习,所以现在才开始:如果大家还留在 iOS 开发,这们语言也是一个趋势: 目前待业中.... 不得不说已逝的2 ...
- 【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
问题描述 Azure Function部署后未执行,查看日志发现错误信息: 2023-12-19T11:12:27.145 [Verbose] Host configuration applied.2 ...