思想决定行为,行为决定习惯,习惯决定性格,性格决定命运 个人觉得在编程里面这句话也很适用哈哈哈哈
最近在学习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);
}
}
}
这样虽然看起来代码比较多 但职责分明 对后续程序的拓展比较有利
看到最后划重点
这节课主要就是通过例子去理解委托 这样做有什么好处 在平常敲代码的时候 也要多去思考 怎样会让代码质量更好一些