C#委托初探 ╰半夏微凉° 2024-04-01 10:16 49阅读 0赞 #### 文章目录 #### * 委托 * * 什么是委托 * 举例一:调用静态方法 * 举例二:调用实例化方法 * 举例三:委托当参数使用 * 委托类型数组 * 泛型委托Action、Func * * Action演示 * Func演示 * 使用委托升级冒泡排序 * 多播委托 * * 案例 * 匿名方法 * Lambda表达式 ## 委托 ## * ***委托(delegate)是一种存储函数引用的类型***。 * ***委托的定义指定了一个返回类型和一个参数列表。*** * 定义了委托之后,就可以声明该委托类型的变量,接着就可以把一个返回类型跟参数列表跟委托一样的函教赋值给这个变量。 * 委托的使用分两步: * 定义 * 声明(变量) * 结构体,枚举的使用同上都分为定义和声明。 * 整数类型、数组类型、字符串类型都是直接声明变量的,因为类型的定义已经完成了(CLR中已经完成定义)。 ### 什么是委托 ### ![在这里插入图片描述][08717dd6fd40405093f7d6343dafdf7e.png] ### 举例一:调用静态方法 ### namespace MyDelegate { internal class Program { static double Multiply(double num1,double num2) { return num1 * num2; } static double Divide(double num1, double num2) { return num1/num2; } //定义委托,注意返回类型和参数类型、个数要一致。 delegate double MyDelegate(double num1, double num2); static void Main(string[] args) { MyDelegate myDelegate = Multiply;//将委托变量名指向具体的函数 Console.WriteLine(myDelegate(4,2)); myDelegate=Divide; Console.WriteLine(myDelegate(4,2)); } } } ### 举例二:调用实例化方法 ### static void Main(string[] args) { Student s1= new Student(18); MYDelegate mYDelegate = s1.say; mYDelegate(); } delegate void MYDelegate(); class Student { private int Id { get; set; } public Student(int id) { Id = id; } public void say() { Console.WriteLine("我今年{0}岁了!",Id); } } ### 举例三:委托当参数使用 ### namespace MyDelegateDemo { internal class Program { delegate void OnDieDelegate(); static void Play(OnDieDelegate onDie) { Console.WriteLine("做任务"); Console.WriteLine("玩家正在战斗"); Console.WriteLine("死亡"); if(onDie!=null) { onDie();//灵活的处理 } } static void ShowDieUI() { Console.WriteLine("显示玩家死亡后的UI"); Console.WriteLine("返回首页"); } static void Main(string[] args) { //传递不同的函数 //与直接调用函数相比较,预留位置,方便整合【相当于接口】 Play(ShowDieUI); Play(null); } } } ### 委托类型数组 ### static double Multiply(double num1,double num2) { return num1 * num2; } static double Divide(double num1, double num2) { return num1/num2; } //定义委托,注意返回类型和参数类型、个数要一致。 delegate double MyDelegate(double num1, double num2); static void Main(string[] args) { Console.WriteLine("============="); MyDelegate[] myDelegates = { Multiply,Divide }; foreach(MyDelegate x in myDelegates) { Console.WriteLine(x(8,2)); } } ### 泛型委托Action、Func ### ![在这里插入图片描述][b9e0d7d413b0473cbdbcd6ed85833159.png] #### Action演示 #### private static void test1() { Console.WriteLine("这是无参的方法"); } private static void test2(int x) { Console.WriteLine("这是有一个int类型参数的方法"); } private static void test3(int x,double y) { Console.WriteLine("这是有2个参数的方法"); } static void Main(string[] args) { Action method = Program.test1; method(); Action<int> method2 = Program.test2; method2(1); Action<int,double> method3 = Program.test3; method3(1,1); } #### Func演示 #### private static int test4() { Console.WriteLine("调用了int类的方法"); return 0; } private static double test5(double x) { **Console.WriteLine("调用了doubl**e类的方法"); return x; } static void Main(string[] args) { Func<int> func = test4; func(); Func<double,double> func2 = test5; func2(6); } ### 使用委托升级冒泡排序 ### namespace test03 { public class Employee { public string Name { get;private set; } public double Salary { get; set; } public Employee(string name, double salary) { Name = name; Salary = salary; } public static bool Compare(Employee e1, Employee e2) { return e1.Salary > e2.Salary; } } } using System; namespace test03 { internal class Program { public static void Sort<T>(T[] data, Func<T, T, bool> compare) { bool swapped = true; do { swapped = false; for (int i = 0; i < data.Length - 1; i++) { if (compare(data[i],data[i+1])) { T temp = data[i]; data[i] = data[i + 1]; data[i + 1] = temp; swapped = true; } } } while (swapped); } public static void Main(string[] args) { Employee[] employees = { new Employee("aa", 7000), new Employee("bb", 3000), new Employee("cc", 2000), new Employee("dd", 5000), new Employee("ee", 4000), new Employee("ff", 1000) }; Sort<Employee>(employees, Employee.Compare); foreach (Employee emp in employees) { Console.WriteLine(emp.Name+":"+emp.Salary); } } } } ![在这里插入图片描述][2331c83d88bc46e4b21a5be306c32d59.png] ### 多播委托 ### * 前面使用的委托都只包含一个方法的调用,但是委托也可以包含多个方法,这种委托叫做多播委托。 * 使用多播委托就可以按照顺序调用多个方法,多播委托只能得到调用的最后一个方法的结果,一般我们把多播委托的返回类型声明为void。 ![在这里插入图片描述][581ab2384042430487f50ca1188a9a89.png] Delegate[] delegates = action.GetInvocationList(); foreach (Delegate d in delegates) { d.DynamicInvoke(); } #### 案例 #### internal class Program { public static void test1() { Console.WriteLine("test1"); } public static void test2() { Console.WriteLine("test2"); } public static void Main(string[] args) { Action action = test1; action();//test1 Console.WriteLine("===="); action += test2; action();//test1 test2 Console.WriteLine("===="); action += test2; action();//test1 test2 test2 Console.WriteLine("===="); action -= test1; //action现在是一个集合 action();//test2 test2 //下面的代码同上面一行效果相同 Delegate[] delegates = action.GetInvocationList(); foreach (Delegate d in delegates) { d.DynamicInvoke(); } } } ### 匿名方法 ### ![在这里插入图片描述][62af19b699194350b0562af5b0ae9c18.png] ### Lambda表达式 ### ![在这里插入图片描述][e822547d1bc74f088c09f46653a84068.png] [08717dd6fd40405093f7d6343dafdf7e.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/01/5f11ed88c43641a99b00b6fe5f47abd2.png [b9e0d7d413b0473cbdbcd6ed85833159.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/01/ed8d9c81b175473ab0891b543e5b0ee5.png [2331c83d88bc46e4b21a5be306c32d59.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/01/cde8f728e14f42478af8303a137e2c0f.png [581ab2384042430487f50ca1188a9a89.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/01/fb22d3caa91643f682992b6963c5aefa.png [62af19b699194350b0562af5b0ae9c18.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/01/16fd8930bd62420fb2ccd8c54b1019de.png [e822547d1bc74f088c09f46653a84068.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/01/b22991ae07e84b5ab5195155efb92434.png
相关 C#委托 一、什么是委托 委托是一种类型,就跟int,double,struct,string,class一样。它定义了一个函数的类型。现在,我们有一个方法,我们希望它的参数是某个 川长思鸟来/ 2024年02月17日 22:49/ 0 赞/ 62 阅读
相关 C#——委托 C\——委托 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过委托 冷不防/ 2023年01月03日 04:22/ 0 赞/ 236 阅读
相关 初探c# c\开发项目时,最常见的3种项目类型分别是: 控制台应用程序、Windows窗体应用程序、ASPNET网站应用程序。 (1)控制台应用程序:是没有独立的窗口的程序,一般在命 川长思鸟来/ 2022年11月30日 04:19/ 0 赞/ 146 阅读
相关 C#委托 委托: 委托定义了方法的类型,使得方法可以作为另一个方法的参数来进行传递,这样可以在程序中避免使用大量的判断语句,同时使程序具有更好的扩展性。 可以将多个方法绑定到同一个委 矫情吗;*/ 2022年09月17日 07:28/ 0 赞/ 195 阅读
相关 c#委托 首先创建个控制台应用程序在Program下创建一个无参数无返回值的静态方法,可以输出一句话 static void Text() { Cons 迈不过友情╰/ 2022年04月16日 06:15/ 0 赞/ 256 阅读
相关 C# 委托 一、什么是委托? 初次理解这么抽象的概念确实有点挺难的,如果学过C语言,可能知道C语言里可以把一个方法当做参数来传递,委托大概类似也是这样一个原理。 想象一下,在一个 ゞ 浴缸里的玫瑰/ 2022年04月08日 12:15/ 0 赞/ 278 阅读
相关 C# 委托 什么是委托? 委托和事件这两个概念是完全配合的。委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个引 野性酷女/ 2022年02月16日 13:51/ 0 赞/ 280 阅读
相关 C# 委托 委托 作用:将多个参数相同的方法,进行委托统一调用,将参数和调用方法传递给委托,由委托调用。 好处:可以将多个方法内相同的部分提取出来,根据参数和方法参数,调用需要的 ゝ一世哀愁。/ 2021年10月14日 02:00/ 0 赞/ 382 阅读
相关 C# 委托 什么是委托? 委托是寻址方法的.NET版本,使用委托可以将方法作为参数进行传递。委托是一种特殊类型的对象,其特殊之处在于委托中包含的是一个或多个方法的地址,而不是数据。委 谁践踏了优雅/ 2021年06月24日 16:10/ 0 赞/ 496 阅读
还没有评论,来说两句吧...