1 什么是委托
反编译之后,发现委托在IL中就是一个类,且继承自System.MulticastDelegate 特殊类,委托延迟了方法的调用,在C#中,委托无处不在
2 委托的初步使用
委托的使用,跟类一样,有三步
第一步 声明委托,委托既可以在类外声明,也可声明在类内
第二步 实例化委托,参数为方法名,方法的参数与返回值必须与声明时指定的一致
第三步 委托调用
using System;
using System.Runtime.CompilerServices;
namespace MyDelegate
{
//类外声明
//无参无返回值
public delegate void NoReturnNoPara(); // 1 声明委托
//有参无返回值
public delegate void NoReturn(string name);
class Program
{
//类内声明
public delegate string NoPara();//无参有返回值
public delegate string WithReturnWithPara(string name);//有参有返回值
static void Main(string[] args)
{
NoReturnNoPara method = new NoReturnNoPara(Show);// 2委托实例化
//两种方式调用
method.Invoke();//3 调用
method();
Console.ReadKey();
}
public static void Show()
{
Console.WriteLine("Show");
}
}
}
3 委托的优势
(1) 逻辑解耦
(2)代码重用
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
namespace MyDelegate
{
public class MultiBranch
{
/// <summary>
/// 如果增加逻辑就要添加分支,
/// 经常改动,不够稳定 难以维护
/// </summary>
/// <param name="name"></param>
/// <param name="peopleType"></param>
public void SayHi(string name, PeopleType peopleType)
{
Console.WriteLine("这里是.NetCore");
switch (peopleType)
{
case PeopleType.Chinese:
Console.WriteLine($"{name}, 晚上好");
break;
case PeopleType.American:
Console.WriteLine($"{name}, good evening");
break;
case PeopleType.French:
Console.WriteLine($"{name}, bonjour");
break;
default:
throw new Exception("wrong PeopleType");
}
}
//增加分支就增加方法,不影响其他方法
//
// 增加公共逻辑,那么每个方法都要改,有重复代码
public void SayHiChinese(string name)
{
Console.WriteLine("这里是.NetCore");
Console.WriteLine($"{name}, 晚上好");
}
public void SayHiAmerican(string name)
{
Console.WriteLine("这里是.NetCore");
Console.WriteLine($"{name}, good evening");
}
public void SayHiFrench(string name)
{
Console.WriteLine("这里是.NetCore");
Console.WriteLine($"{name}, bonjour");
}
}
public enum PeopleType
{
Chinese,
American,
French
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace MyDelegate
{
public delegate void SayHiDelegate(string name);
public class DelegateTest
{
/// <summary>
/// 既增加公共逻辑方便,又逻辑分离维护简单
///
/// 逻辑解耦
/// 代码重用
/// </summary>
/// <param name="name"></param>
/// <param name="method"></param>
public void SayHiPerfect(string name, SayHiDelegate method)
{
Console.WriteLine("这里是.NetCore");
method.Invoke(name);
}
public void SayHiChinese(string name)
{
Console.WriteLine("这里是.NetCore");
Console.WriteLine($"{name}, 晚上好");
}
public void SayHiAmerican(string name)
{
Console.WriteLine("这里是.NetCore");
Console.WriteLine($"{name}, good evening");
}
public void SayHiFrench(string name)
{
Console.WriteLine("这里是.NetCore");
Console.WriteLine($"{name}, bonjour");
}
}
}