class Program
{
static void Main(string[] args)
{
MyDelegateEvent delegateEvent = new MyDelegateEvent();
delegateEvent.Show();
Student student = new Student();
student.SayHi();
Console.ReadKey();
}
}
// 1.委托本质就是个类
// 2.继承自System.MulticastDelegate 特殊类-不能被继承
class MyDelegateEvent
{
//1. 委托声明
public delegate void NoReturnNopara();
public delegate void NoReturnWithPara(int x, int y);
public delegate MyDelegateEvent WithReturnWithPara(out int x, ref int y);
public void Show()
{
//2.委托的实例化 要求传递一个参数类型 返回值类型跟委托一致
NoReturnNopara method = new NoReturnNopara(this.DoNothing);
//WithReturnWithPara withPara = new WithReturnWithPara(this.ParaReturn);
//int y = 3;
//withPara.Invoke(out int x,ref y);
//3.委托实例的调用
method.Invoke();
method();//也可以省略掉.Invoke()
IAsyncResult asyncResult = method.BeginInvoke(null, null); //启动一个线程完成计算
//method.EndInvoke(asyncResult);//等待异步调用结束
}
public void DoNothing()
{
Console.WriteLine("this is DoNothing");
}
private MyDelegateEvent ParaReturn(out int x, ref int y)
{
throw new Exception();
}
}
public delegate void SayHiDelegate(string name);
class Student
{
//自上往下 逻辑解耦 ,方便升级维护
//自下往上 代码重用,去掉重复代码
public void SayHi()
{
SayHiPerfact("王大师", this.China);
SayHiPerfact("Tom Hiddleston", this.Britain);
SayHiPerfact("蒼井そら", Japan);
}
/// <summary>
/// 相同的东西用一个方法实现,不同的各自去写,然后通过委托组合
/// </summary>
/// <param name="name"></param>
/// <param name="method"></param>
public void SayHiPerfact(string name, SayHiDelegate method)
{
Console.WriteLine("我是通用方法");//这里可以写通用方法 比如写日志,加异常处理
method.Invoke(name); //执行不同逻辑
}
public void China(string name)
{
Console.WriteLine($"{name},早上好");
}
public void Britain(string name)
{
Console.WriteLine($"{name},Good morning");
}
public void Japan(string name)
{
Console.WriteLine($"{name},おはよう");
}
}