委托篇——初步理解委托

 思想决定行为,行为决定习惯,习惯决定性格,性格决定命运  个人觉得在编程里面这句话也很适用哈哈哈哈

 最近在学习C#课程 学到委托这里 突然觉得 人一定要多学习 不断刷新自己的认知 在平常遇到问题解决问题的时候 也要多问几句为什么  就像写代码跟写好代码完全是两回事  屁话不多说了 开始

首先 委托是什么?

委托是一个,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递(可以理解为是一个特殊的关键字为delegate的类,一般当做参数来传递)

那么它究竟是什么样子的呢?怎么来定义并且调用的呢?

1.委托的声明实例及调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Studying
{
    /// <summary>
    /// 委托的声明实例及调用
    /// </summary>
    public class CompanyClass
    {
        //委托的声明
        public delegate void weituo(string x);

        public static void show()
        {
            //实例化
            weituo wt = new weituo(use);

            Console.WriteLine("********************委托的基本调用********************");

            //委托的调用
            wt("这样");
            wt.Invoke("这样");
        }

        public static void use(string x)
        {
            Console.WriteLine("{0}调用委托", x);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Studying
{
   public class Program
    {
       public static void Main(string[] args)
        {
            CompanyClass.show();
        }
    }
}

控制台输出信息,如下图

这样就可以实现委托的基本声明以及调用啦  那么问题来了 这样跟我直接调用 use 方法有什么不同呢?这样做究竟有什么好处呢?我们接着往下看

2.委托的实际用途及好处

我这里希望可以在控制台输出一个问候语,一般情况下我的代码会是这样的 直接定义一个方法 在主程序调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Studying
{
    /// <summary>
    /// 理解委托
    /// </summary>
   public class Customer
    {
        public static void Service(string name)
        {
            Console.WriteLine("{0} Good morning!",name);
        }

    }
}

调用后结果如下图:

目前程序进行到这里 是没有问题的 但这时候 突然来了个需求 需要支持中英日韩四国语言  并且需要打日志文件 那这个时候会怎么处理呢? 一般这种情况下 我会这样:新添加一个参数 用if进行判断 如下图 

        public static void Service(string name, LanguageType type)
        {
            if (type == LanguageType.Chin)
            {
                //log 每个判断里面都需要加相同的log代码
                Console.WriteLine("{0} 早上好!", name);
            }
            else if (type == LanguageType.JAP)
            {
                //log
                Console.WriteLine("{0} おはよう!", name);
            }
            else if (type == LanguageType.Korea)
            {
                //log
                Console.WriteLine("{0} 안녕하세요!", name);
            }
            else
            { 
                //log
                throw new Exception("erro");
            }
        }

        public enum LanguageType
        {
            Chin,
            ENG,
            JAP,
            Korea
        }

这种是个人最常规的做法 这样程序运行下来是没有问题的 但这样并没有做职责分离 1.判断类型 2.log方法 3.打印问候语 这三件事情都在一个方法里面进行 如果后续还需要再继续拓展 就必须在这个方法里面修改  这样可能会对程序的拓展性和稳定性有所影响

那么委托的好处就是可以增加程序的可拓展性 进行职责分离 实现低耦合 下面是我用委托实现的同样的功能

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Studying
{
    /// <summary>
    /// 理解委托
    /// </summary>
   public class Customer
    {
        public static void Eng(string name)
        {
            Console.WriteLine("{0}Good morning!",name);
        }

        public static void Chinese(string name)
        {
            Console.WriteLine("{0}猫宁!",name);
        }

        public static void JAP(string name)
        {
            Console.WriteLine("{0}おはよう!",name);
        }

        public static void Korea(string name)
        {
            Console.WriteLine("{0}안녕하세요!",name);
        }



        public static void Show(string name, language lang)
        {
            //log 只需要在这里加log
            lang(name);
        }

    }
    //1.声明委托
    public delegate void language(string name);

 
}

在主程序中传相应的方法 即可得到相应的语言

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Studying
{
   public class Program
    {
       public static void Main(string[] args)
        {
            // CompanyClass.show();
            // Customer.Service("Michael Jackson");

            //实例化
            language lang = new language(Customer.JAP);

            //调用
            Customer.Show("Michael Jackson", lang);
        }
    }
}

这样虽然看起来代码比较多 但职责分明 对后续程序的拓展比较有利 


看到最后划重点

这节课主要就是通过例子去理解委托  这样做有什么好处 在平常敲代码的时候 也要多去思考 怎样会让代码质量更好一些 

猜你喜欢

转载自blog.csdn.net/qq_38093594/article/details/81626091