C# 委托和泛型委托示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp6 { class Program { public delegate void SaySomething(string name); //定义委托 public static event SaySomething peopleCome; //定义事件 关注SaySomething委托,当事件发生的时候,会通知关注的“委托”(再由这些“委托”去调用具体的方法)。 private delegate double DoCallFunc(double num1, double num2); static void Main(string[] args) { peopleCome += SayHello; //注册方法到事件上 peopleCome += SayNiceToMeetYou; //注册方法到事件上 peopleCome += SayGoodbye; //注册方法到事件上 peopleCome("张三"); //绑定触发事件 Console.WriteLine("====================================="); int x = 10; int y = 3; // DoCallFunc md = new DoCallFunc(Add); DoCallFunc df; 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)); 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(); } #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>表示调用带两个参数的方法。 */ private static double Calculate(double num1, double num2, Func<double, double, double> callFunc) { return callFunc(num1, num2); } #endregion #region 数字的加减乘除 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 } }
分类:
C#.Net & MVC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架