当前位置:
首页 > Python基础教程 >
-
C#教程之.Net 委托 delegate 学习
一、什么是委托:
委托是寻址方法的.NET版本,使用委托可以将方法作为参数进行传递。委托是一种特殊类型的对象,其特殊之处在于委托中包含的只是一个活多个方法的地址,而不是数据。
二、使用委托: 关键字:delegate
1.声明:
public delegate void DoNothing();//定义一个无返回值,无参数的委托
public delegate int GetNum(int i); //定义有一个返回值int ,参数int 的委托
2.创建方法:
public static void DoSome()//无参无返回值的方法
{
Console.WriteLine("DoSome");
}
{
Console.WriteLine("DoSome");
}
public static int TotalNum(int num)//有一个返回值int ,参数int 的方法
{
return num * num;
}
{
return num * num;
}
3.注册委托:
DoNothing doNothing = new DoNothing(DoSome);
//或者直接写出DoNothing doNothing = DoSome;
GetNum getNum = AddNum;//注册委托
4.执行委托
doNothing.Invoke();//执行委托 也可以直接 doNothing();
Console.WriteLine(getNum.Invoke(10));//执行委托并且打印
三、委托的意义
传递方法;把方法包裹起来, 传递逻辑。异步多线程执行
四、.net framework3.5之后,系统定义好了2个委托,开发尽量使用框架自带委托,尽量使用Action和Func
Action 无返回值委托,Func 有返回值委托
Action要使用参数,就写Action<int,string,double> 最多可以到16个
Func要使用参数,就写成Func<int,string,double> 最多可以到17个, 最后一个为返回值,现在这个返回的就是double类型
Action act = DoSome;//Action 无返回值委托
act.Invoke();
Func<int,int> func = new Func<int,int>(TotalNum) ;
func(10);
五、多播委托
Action doSome = new Action(DoSome);
doSome += new Action(DoSome);
doSome += DoSome;
doSome += new Action(DoSome);
doSome += DoSome;
doSome();//按顺序执行,最后结果是执行3次DoSome方法
doSome -= DoSome;//减少一次DoSome执行
doSome();//按顺序执行,最后结果是执行2次DoSome方法
多播委托,按顺序执行,多播委托,用Action, Func带返回值的只执行完后,只得到最后一个结果,所以没有意义。
委托使用案例:一个学生类,一个学生管理静态类,可以通过委托,实现学生集合的筛选
public class Student { public int Id { get; set; } public string Name { get; set; } public int ClassId { get; set; } public int Age { get; set; } } public static class StudentManager { public static List<Student> students = new List<Student>() { new Student(){ Id=1,Name="张三",ClassId=1001,Age=15 }, new Student(){ Id=2,Name="李四",ClassId=1001,Age=15 }, new Student(){ Id=3,Name="王五",ClassId=1001,Age=15 }, new Student(){ Id=4,Name="赵六",ClassId=1001,Age=15 }, new Student(){ Id=5,Name="杨幂",ClassId=1001,Age=14 }, new Student(){ Id=6,Name="范冰冰",ClassId=101,Age=14 }, new Student(){ Id=7,Name="张学友",ClassId=1021,Age=14}, new Student(){ Id=8,Name="张三1",ClassId=1021,Age=16 }, new Student(){ Id=9,Name="张三2",ClassId=1001,Age=17 }, new Student(){ Id=10,Name="张三3",ClassId=1001,Age=15 }, new Student(){ Id=11,Name="张三4",ClassId=1001,Age=19 }, new Student(){ Id=12,Name="张三5",ClassId=1001,Age=25 }, new Student(){ Id=13,Name="张三6",ClassId=1003,Age=25 }, new Student(){ Id=14,Name="张三7",ClassId=1003,Age=25 }, new Student(){ Id=15,Name="张三8",ClassId=1003,Age=25 }, new Student(){ Id=16,Name="张三9",ClassId=1003,Age=25 }, new Student(){ Id=17,Name="张三0",ClassId=1003,Age=25 }, new Student(){ Id=18,Name="张三11",ClassId=1003,Age=15 }, new Student(){ Id=19,Name="张三a",ClassId=1011,Age=15 }, new Student(){ Id=20,Name="张三b",ClassId=1011,Age=15 }, new Student(){ Id=21,Name="张三c",ClassId=1011,Age=15 }, new Student(){ Id=22,Name="张三d",ClassId=1011,Age=15 }, new Student(){ Id=23,Name="张三e",ClassId=1011,Age=15 }, new Student(){ Id=24,Name="张三f",ClassId=1011,Age=15 }, new Student(){ Id=25,Name="张三g",ClassId=3001,Age=15 }, new Student(){ Id=26,Name="张三h",ClassId=3001,Age=13 }, new Student(){ Id=27,Name="张三i",ClassId=3001,Age=13 }, new Student(){ Id=28,Name="张三j",ClassId=3001,Age=13 }, new Student(){ Id=29,Name="张三k",ClassId=3001,Age=13 }, }; public static List<Student> FindStudents(Func<Student,bool> func) { List<Student> stus = new List<Student>(); foreach (var item in students) { if (func(item)) { stus.Add(item); } } return stus; } /// <summary> /// 查找ClassId为3001的学生 /// </summary> /// <param name="student">学生</param> /// <returns>是否为3001班级的学生</returns> public static bool GetClassId(Student student) { if (student.ClassId==3001) { return true; } return false; } /// <summary> /// 年龄大于20的学生 /// </summary> /// <param name="student"></param> /// <returns></returns> public static bool GetBigAge(Student student) { if (student.Age>20) { return true; } return false; } /// <summary> /// 年龄大于15 并且ClassId为1021 /// </summary> /// <param name="student"></param> /// <returns></returns> public static bool GetStuByClassIdAndAge(Student student) { if (student.Age > 15 && student.ClassId==1021) { return true; } return false; } }
下面这个是在Main方法中执行查询学生
//List<Student> stus = StudentManager.students; //Console.WriteLine("姓名---年龄---班级--编号"); //foreach (var item in stus) //{ // Console.WriteLine(item.Name+"---"+item.Age+"---"+item.ClassId+"---"+item.Id); //} List<Student> stus1= StudentManager.FindStudents(StudentManager.GetStuByClassIdAndAge); Console.WriteLine("姓名---年龄---班级--编号"); foreach (var item in stus1) { Console.WriteLine(item.Name + "---" + item.Age + "---" + item.ClassId + "---" + item.Id); }
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式