委托学习小案例二
委托学习小案例二
/// <summary> /// 泛型、委托、事件 /// </summary> class Program { //1.声明委托 public delegate void SaySomething(string name); private delegate double DoCallFunc(double num1, double num2); //2.声明事件 public static event SaySomething peopleCome; // 关注SaySomething委托,当事件发生的时候,会通知关注的“委托”(再由这些“委托”去调用具体的方法)。 #region 普通委托 private static double Calculate2(double num1, double num2, DoCallFunc doCallFunc) { return doCallFunc(num1, num2); } #endregion #region 泛型委托 /* 泛型Action<T>委托表示引用一个void返回类型的方法。Action<T>委托类存在不同的变体,可以传递至多16种不同的参数类型, 没有泛型参数的Action类可以调用没有参数的方法。 例如:Action<in T1>调用带一个参数的方法,Action<in T1,in T2>调用带两个参数的方法等 Func<T>的用法和Action<T>用法类似,但是Func<T>表示引用一个带返回类型的方法, Func<T>也存在不同的变体,至多可以传递16个参数类型和1个返回类型, 例如:Func<in T1,out Resout>表示带一个参数的方法,Func<in T1,in T2,out Resout>表示调用带两个参数的方法。 */ //3.利用Func<T>定义委托方法 private static double Calculate(double num1, double num2, Func<double, double, double> callFunc) { return callFunc(num1, num2); } #endregion #region 数字的加减乘除 //4.定义委托引用的方法 //加 private static double Add(double num1, double num2) { Console.WriteLine("{0} + {1} = {2}", num1, num2, num1 + num2); return num1 + num2; } //减 private static double Sub(double num1, double num2) { Console.WriteLine("{0} - {1} = {2}", num1, num2, num1 - num2); return num1 - num2; } //乘 private static double Multiply(double num1, double num2) { Console.WriteLine("{0} * {1} = {2}", num1, num2, num1 * num2); return num1 * num2; } //除 private static double Divide(double num1, double num2) { Console.WriteLine("{0} / {1} = {2}", num1, num2, num1 / num2); return Math.Round(num1 / num2, 2, MidpointRounding.AwayFromZero); //4舍5入 } #endregion #region 测试 //定义委托引用方法 public static void SayHello(string name) { Console.WriteLine("Hello," + name + "!"); } public static void SayNiceToMeetYou(string name) { Console.WriteLine("Nice to meet you," + name + "!"); } public static void SayGoodbye(string name) { Console.WriteLine("Bye bye," + name + "!"); } #endregion static void Main(string[] args) { peopleCome += SayHello; //注册方法到事件上 peopleCome += SayNiceToMeetYou; //注册方法到事件上 peopleCome += SayGoodbye; //注册方法到事件上 peopleCome("Jerry"); //绑定触发事件 Console.WriteLine("====================================="); int x = 4; int y = 3; // DoCallFunc md = new DoCallFunc(Add); DoCallFunc df; //引用委托方法Add df = Add; Console.WriteLine("callFunc:{0}", df(x, y)); df = Sub; Console.WriteLine("callFunc:{0}", df(x, y)); df = Multiply; Console.WriteLine("callFunc:{0}", df(x, y)); df = Divide; Console.WriteLine("callFunc:{0}", df(x, y)); //委托引用方法调用 Console.WriteLine("====================================="); Console.WriteLine("callFunc:{0}", Calculate(x, y, Add));//引用委托方法Add Console.WriteLine("callFunc:{0}", Calculate(x, y, Sub)); Console.WriteLine("callFunc:{0}", Calculate(x, y, Multiply)); Console.WriteLine("callFunc:{0}", Calculate(x, y, Divide)); Console.ReadKey(); } }
本文来自博客园,作者:码农阿亮,转载请注明原文链接:https://www.cnblogs.com/wml-it/p/14768743.html
技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
开源库地址,欢迎点亮:
GitHub:https://github.com/ITMingliang
Gitee: https://gitee.com/mingliang_it
GitLab: https://gitlab.com/ITMingliang
建群声明: 本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,为大家答疑解惑。热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!进群方式:扫码关注公众号,后台回复【进群】。