欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.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");
}
public static int totalnum(int num)//有一个返回值int ,参数int 的方法
{
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();//按顺序执行,最后结果是执行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);
            }