.Net 委托 delegate 学习
程序员文章站
2022-04-28 11:57:42
一、什么是委托: 委托是寻址方法的.NET版本,使用委托可以将方法作为参数进行传递。委托是一种特殊类型的对象,其特殊之处在于委托中包含的只是一个活多个方法的地址,而不是数据。 二、使用委托: 关键字:delegate 1.声明: public delegate void DoNothing();// ......
一、什么是委托:
委托是寻址方法的.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); }
上一篇: 我妈一直禁止我买奢侈品
下一篇: 新买的衣服,怎么样~