C# 委托
1. 委托的声明
/// <summary> /// 1 委托在IL就是一个类 /// 2 继承自System.MulticastDelegate 特殊类-不能被继承 /// </summary> public delegate void NoReturnNoPara(); public delegate void NoReturnWithPara(int x, int y);//1 声明委托 public delegate int WithReturnNoPara(); public delegate MyDelegate WithReturnWithPara(out int x, ref int y);
2.委托的使用
public class OtherClass { public void DoNothing() { Console.WriteLine("This is DoNothing"); } public static void DoNothingStatic() { Console.WriteLine("This is DoNothingStatic"); } } public class MyDelegate //: System.MulticastDelegate { public int Get() { return 1; } private MyDelegate ParaReturn(out int x, ref int y) { throw new Exception(); } private void DoNothing() { Console.WriteLine("This is DoNothing"); } private static void DoNothingStatic() { Console.WriteLine("This is DoNothingStatic"); } }
NoReturnNoPara method = new NoReturnNoPara(this.DoNothing); NoReturnNoPara method1 =this.DoNothing;//简写 //2 委托的实例化 要求传递一个参数类型 返回值都跟委托一致的方法, method.Invoke();//3委托实例的调用 参数和委托约束的一致 this.DoNothing();//效果跟直接调用方法一致 method();//可以省略.Invoke method.BeginInvoke(null, null);//启动一个线程完成计算 //method.EndInvoke(null); //委托就是一个类 为什么要用委托? 这个类的实例可以放入一个方法,实例Inovke时,就调用方法 //说起来还是在执行方法,为啥要做成三个步骤? 唯一的差别,就是把方法放入了一个对象/变量
3. 委托的应用
例子:
/// <summary> /// 中国人---晚上好 /// 美国人---good evening /// ... /// /// 假如要增加一个国家的人Malaysia,就得修改方法,增加一个分支 /// 任意分支变化 都得修改方法 /// 经常改动 很不稳定 难以维护 /// /// 增加公共逻辑方便 /// /// 为不同的人,进行不同的问候 /// 传递个变量---判断一下---执行对应的逻辑 /// 能不能直接点,直接传递逻辑呗 /// 逻辑就是方法---委托 /// </summary> /// <param name="name"></param> public void SayHi(string name, PeopleType peopleType) { Console.WriteLine("prepare SayHi.."); switch (peopleType) { case PeopleType.Chinese: Console.WriteLine($"{name},晚上好~"); break; case PeopleType.American: Console.WriteLine($"{name},good evening~"); break; case PeopleType.Malaysia: Console.WriteLine($"{name},*^%*^%^&%^%~"); break; default://遇到不认识的枚举,说明调用有问题,那就不要隐藏,直接异常 throw new Exception("wrong peopleType"); } }
改写
//1 加参数判断---执行分支逻辑 //2 加方法满足不同的场景 如果方法特别复杂,就推荐这个 /// <summary> /// 既增加公共逻辑方便,又逻辑分离维护简单 鱼肉熊掌怎么兼得? /// 自上往下---逻辑解耦,方便维护升级 /// /// 自下往上---代码重用,去掉重复代码 /// </summary> public void SayHi(string name, SayHiDelegate method) { //Action<string,int> //Func<string> Console.WriteLine("prepare SayHi.."); method.Invoke(name); }
public delegate void SayHiDelegate(string name); /// <summary> /// 增加分支,就增加方法--不影响别的方法 /// 修改某个方法--不影响别的方法 /// /// 增加公共逻辑---多个方法有很多重复代码 /// /// 既有相同的东西,也有不同的东西 /// 相同的东西用一个方法实现,不同的各自去写,然后通过委托组合 /// </summary> /// <param name="name"></param> public void SayHiChinese(string name) { //Console.WriteLine("prepare SayHi.."); Console.WriteLine($"{name},晚上好~"); } public void SayHiAmerican(string name) { //Console.WriteLine("prepare SayHi.."); Console.WriteLine($"{name},good evening~"); } public void SayHiMalaysia(string name) { //Console.WriteLine("prepare SayHi.."); Console.WriteLine($"{name},*^%*^%^&%^%~~"); }
--------------------调用--------------------------------- SayHiDelegate method = SayHiChinese; student.SayHi("大脸猫", method); SayHiDelegate method1 =SayHiAmerican; student.SayHi("PHS", method1); SayHiDelegate method2 = SayHiMalaysi; student.SayHi("icefoxz", method2);
付费内容,请联系本人QQ:1002453261
本文来自博客园,作者:明志德道,转载请注明原文链接:https://www.cnblogs.com/for-easy-fast/p/12335034.html