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点的时候,闹钟就会响起来,从而学生才会按时起床. ...
随机推荐
- P4414题解
原题 题意简述: 有 $3$ 个整数,将他们排序,将它们存到 $a,b,c$ 三个变量中,满足 $a<b<c$,再按照规则输出. 不难发现,我们可以用到 sort 函数,这个函数的作用是将 ...
- 【Unity3D】2D动画
1 图片处理 通过 PS 软件将以下 gif 文件中的黑色背景删除,并将其中的 18 个图层分别保存为 png 格式图片. 2 游戏对象 1)游戏对象层级结构 2)Transform组件参 ...
- 编译静态库遇到的 LNK2019 报错
前文提到了 CMake 学习 文末基本涵盖了我遇到的编译问题,但是在得到一个编译好的 .lib 文件后,还需要放到项目中引用成功后才算真正的完成静态库的编译 嗯,我之所以说这些是因为我在项目中链接静态 ...
- Direct2D 另一种与D3D创建类似的方法
在进行D2D学习的时候,发现了这样一篇文档, Direct2D Quickstart for Windows 8 只有这么一小段介绍, Direct2D is a native-code, immed ...
- go值接收者和指针接收者的区别
方法的接收者 package main import ( "fmt" ) type Person struct { Name string Age int } func (p Pe ...
- nginx中自带的一些变量参数说明
$args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...
- 02、etcd单机部署和集群部署
上一章我们认识了etcd,简单的介绍了 etcd 的基础概念,但是理解起来还是比较抽象的.这一章我们就一起来部署下 etcd .这样可以让我们对 etcd 有更加确切的认识. 1.etcd单实例部署 ...
- WPF性能优化:性能分析工具
在硬件性能不断提升的现在,软件性能依旧是开发人员关注的重点.不同类型的程序关注的具体性能指标有所不同,服务器程序注重吞吐量,游戏引擎追求渲染效率,桌面程序则关注内存消耗以及界面加载效率和流畅性.当我们 ...
- Nebula Importer 数据导入实践
本文首发于 Nebula Graph Community 公众号 前言 Nebula 目前作为较为成熟的产品,已经有着很丰富的生态.数据导入的维度而言就已经提供了多种选择.有大而全的Nebula Ex ...
- C++之指针变量的定义和使用
从b站上黑马程序员的c++课里学到的C++之指针变量的定义和使用 指针变量的定义和使用 简单理解指针就是地址. 内存编号是从0开始记录的,一般用16进制数字表示 1 #include <iost ...