标签:好处 hide 完成 类的构造函数 str for 生成 对象 cti
委托大家都不陌生吧,我们经常都会接触到或用到。LINQ查询就是基于委托来实现的。
我们常常这样定义委托: public delegate void SayHiDelegate(string name);
那么委托的本质是什么呢?
在介绍委托的本质前,我们先来认识一下IL,IL是中间语言,是我们在VS写的代码和计算机二进制代码的中间语言。我们的代码编译生成IL,IL通过GIT最终编译成计算机能识别的计算机二进制代码。IL可以看到真正原生的C#代码,我们在深度研讨一些技术时,IL是一个很好的助手,可以看到真实的代码。
我们都知道我们的C#编译好的代码可以通过反编译工具看到代码的实现过程(如反编译工具ILSpy)
ILSpy可以选择查看VS写的C#代码或者IL中间代码,如下图所示:
我们选择IL查看时,就可以看到每个老师都说的,任何类型都继承自Object对象,如下图所示;
我们也可以发现累的.ctor标识的就是类的构造函数,
我们查看delegate发现delegate继承自多播委托MulticastDelegate。
从这里我么就可以了解到委托的本质,委托实际就是一个类。
委托不就是调用方法吗?我们直接通过方法调用就可以实现?为啥还要用委托呢?
主要因为委托有一下一些好处:
①逻辑解耦,保持稳定:我们的委托传入的参数是一个方法,一个方法就是一个逻辑结构,我们通过委托,可以包裹方法逻辑
②可以完成代码复用、保证项目一致性,便于集中管理代码:不同的人有不同的代码编写习惯,我们可以通过委托实现公共部分抽离封装、独自部分分离执行。
我的这个简单小程序就利用委托实现的,大家可以参考看下
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Theme.Delegate { public delegate void SayHiDelegate(string name);//委托的本质是一个类一个继承了多播委托的类(MulticastDelegate) class Program { static void Main(string[] args) { //每一个方法就是一个逻辑,我们通过委托把方法作为一个参数传入,相当于实现了分离逻辑的耦合性 Say("黎明", SayHiChiness); Say("James", SayHiAmerica); Say("landes", SayHiJapan); Say("kloer", SayHiKorea); Console.ReadLine(); } public static void Say(string name,SayHiDelegate method) { Console.WriteLine("before。。。。");//模拟公共复用代码部分 method(name);//等价于method.Invoke(name); Console.WriteLine("after。。。。");//模拟公共复用代码部分 } public static void SayHiChiness(string name) { Console.WriteLine("你好,欢迎您:"+name); } public static void SayHiJapan(string name) { Console.WriteLine("SHJDH56%^%^S%A^:"+name); } public static void SayHiAmerica(string name) { Console.WriteLine("hi,Welcome:" + name); } public static void SayHiKorea(string name) { Console.WriteLine("#$SYUD^&&S^&HSD&:" + name); } } }
在上述代码中,我通过SayHiDelegate方法就可以把各个不同的SayHi方式封装起来。今后如果需要扩展sayhi方法时,我们就不在调用时直接指定sayhi的逻辑方法。
使用委托后,就相当于把公共部分抽离、封装,达到代码复用的目的,不同部分放到委托的里面回调执行。
标签:好处 hide 完成 类的构造函数 str for 生成 对象 cti
原文地址:https://www.cnblogs.com/zxwDont/p/11493251.html