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

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

  • 相关阅读:
    java第九周上机
    安卓-计算器
    安卓第四周作业
    第十五周作业
    第十三周作业
    第十三周上机作业
    第十二周作业
    第十二周上机作业
    第十一周作业
    第十一周上机作业
  • 原文地址:https://www.cnblogs.com/zxwDont/p/11493251.html
Copyright © 2020-2023  润新知