委托IL解析-----封装逻辑和代码复用

委托IL解析-----封装逻辑和代码复用

1.委托的本质

委托大家都不陌生吧,我们经常都会接触到或用到。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

从这里我么就可以了解到委托的本质委托实际就是一个类

2.委托的作用

委托不就是调用方法吗?我们直接通过方法调用就可以实现?为啥还要用委托呢?

主要因为委托有一下一些好处:

①逻辑解耦,保持稳定:我们的委托传入的参数是一个方法,一个方法就是一个逻辑结构,我们通过委托,可以包裹方法逻辑

②可以完成代码复用、保证项目一致性,便于集中管理代码:不同的人有不同的代码编写习惯,我们可以通过委托实现公共部分抽离封装、独自部分分离执行。

我的这个简单小程序就利用委托实现的,大家可以参考看下

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的逻辑方法。

使用委托后,就相当于把公共部分抽离、封装,达到代码复用的目的,不同部分放到委托的里面回调执行。

猜你喜欢

转载自www.cnblogs.com/zxwDont/p/11493251.html
今日推荐