美文网首页
Lession07委托、Lambda表达式、事件

Lession07委托、Lambda表达式、事件

作者: 任人渐疏_Must | 来源:发表于2021-06-09 09:18 被阅读0次

    委托

     /*
        * 委托是一种数据类型(既然是数据类型,就可以定义变量),是来存储方法的
        * 
        * 语法:[访问修饰符] delegate  返回类型  委托名();
        * 
        */
        class Program
        {
            static void Main(string[] args)
            {
                //MyClass mc = new MyClass();
    
                //2.使用委托第二步:声明委托变量,并赋值
                //声明一个委托变量md,并且new了一个委托对象,并且把方法M1传递了进去
                //即md委托保存了M1方法
                MyDelegate md = new MyDelegate(M1);
                //3.调用md委托的时候就相当于调用了M1方法
                md();
                Console.WriteLine("ok");
                //实例化MachCalc类
                MachCalc mc = new MachCalc();
                //实例化委托
                CallBack cb = new CallBack(mc.Plus);
                CallBack cb2 = new CallBack(mc.Minus);
                //调用委托
                int res = cb(10,20);
                int jian = cb2(20, 10);
                Console.WriteLine("res的值是:{0}", res);
                Console.WriteLine("jian的值是:{0}", jian);
    
                Console.ReadKey();
            }
            static void M1()
            {
                Console.WriteLine("我是一个没有返回值没有参数的方法");
            }
        }
        //1.定义委托
        //定义一个委托类型,用来保存无参数,无返回值的方法
        //定义了一个名字叫MyDelegate的类型 ,并且这个类型是个委托,而且只能存储没有返回值,没有参数的方法
        //委托要定义在命名空间中和类是同一级别的
        public delegate void MyDelegate();
    
        //定义了一个MyClass的一个类型
        public class MyClass
        {
    
        }
    
     //定义委托
        public delegate int CallBack(int n1,int n2);
        class MachCalc
        {
            //两个整数类型相加
            public int Plus(int num1,int num2)
            {
                return num1 + num2;
            }
            //两个整数类型相减
            public int Minus(int num1,int num2)
            {
                return num1 - num2;
            }
        }
    
    

    Lambda表达式、匿名函数

    /*
          * 1.委托是一种数据类型,像类一样的一种数据类型,一般都是直接在命名空间中定义
          * 2.定义委托时,需要指明返回值类型、委托名与参数列表,这样就能确定该类型的委托能存储什么样的方法
          * 3.使用委托:
          *    a:声明委托变量
          *    b:委托是一个引用类型,像类一样,所以当声明委托变量后,如果不赋值则该委托变量为null,所以再使用委托变量前最好做
          *    非空校验weituo!=null
          *    c:委托类型的变量只能赋值一个委托类型的对象
          * 
          * 
          * 匿名方法:
          * 不能直接在类中定义,而是在给委托变量赋值的时候,需要赋值一个方法,此时可以“现做现卖”,定义一个匿名方法传递给该委托
          * 语法:
          * 委托类型 委托实例 = delegate([参数列表]){
          *     //代码块
          * };
          * 
          * lambda表达式:
          * (参数类型 参数)=>表达式
          * 
          */
        class Program
        {
            static void Main(string[] args)
            {
                //MyDelegate md = M1;
                //md();
                //无参数,无返回值的一个匿名方法
                //MyDelegate md = delegate ()
                //{
                //    Console.WriteLine("hello 我是匿名方法");
                //};
                //md();
    
                //无参数,无返回值的方法使用(lambda)λ表达式
                MyDelegate md = () => { Console.WriteLine("lambda表达式"); };
                md();
    
    
                //有参数,无返回值的一个匿名方法
                //MyDelegate2 md2 = delegate (string msg)
                //{
                //    Console.WriteLine("早上好!" + msg);
                //};
                //md2("黄鹏");
                MyDelegate2 md2 = m => { Console.WriteLine(m); };
                md2("无返回值有参数的lambda表示式");
    
                //有参数,有返回值的匿名方法
                //AddDelegate add = delegate (int n1, int n2, int n3)
                //{
                //    return n1 + n2 + n3;
                //};
    
                //int res = add(10, 20, 30);
                //Console.WriteLine(res);
    
                AddDelegate add = (x, y, z) => { return x + y + z; };
                int res = add(10, 30, 60);
                Console.WriteLine(res);
                Console.ReadKey();
            }
    
            static void M1()
            {
                Console.WriteLine("OK");
            }
        }
    
        public delegate void MyDelegate();
        public delegate void MyDelegate2(string msg);
        public delegate int AddDelegate(int n1, int n2, int n3);
    
    

    事件

     /*
         * 定义:事件:单词Event  能够发生的什么事情
         * 角色:使对象和类具备通知能力的成员
         * 理解:对象o拥有一个事件e,想表达的思想是:当事情e发生的时候,o有能力通知别的对象
         * 使用:用于对象或类间的动作协调与信息传递(消息推送)
         * 
         * 事件模型的五个组成部分
         * 1.事件的拥有者(event source,对象)
         * 2.事件成员 (event,成员)
         * 3.事件的响应者(event subscriber,对象)
         * 4.事件处理器(event handle,成员)——————本质上是一个回调方法
         * 5.事件订阅——————把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的“约定”
         * 
         * 事件基于委托
         * C#中时间处理步骤:
         * 1.定义事件
         * [访问修饰符] event 委托名 事件名
         * 2.订阅事件
         * 事件名 += new 委托(事件处理方法名)
         * 3.事件发生时通知订阅者发生的事件
         * 事件名([参数列表]);
         * 
         */
    
    
        //Teacher是教师类
        public class Teacher
        {
            //定义一个委托和一个事件
            public delegate void ListenerEventHandler();
            public event ListenerEventHandler ListenerEvent;
    
            //定义引发事件的方法
            public void BeginClass()
            {
                Console.WriteLine("教师宣布开始上课");
                if (ListenerEvent != null)
                {
                    ListenerEvent(); //引发事件
                }
            }
        }
    
        //学生类
        public class Student
        {
            private string stuName;//学生姓名
            //构造方法
            public Student(string name)
            {
                this.stuName = name;
            }
            public void Listener()
            {
                Console.WriteLine("学生{0}正在认真听课", stuName);
            }
            public void Record()
            {
                Console.WriteLine("学生{0}正在做笔记", stuName);
            }
            public void Sleep()
            {
                Console.WriteLine("学生{0}正在睡觉", stuName);
            }
    
        }
        class Program
        {
            static void Main(string[] args)
            {
                Teacher t = new Teacher();
                Student stu1 = new Student("黄鹏");
                Student stu2 = new Student("高洋");
                Student stu3 = new Student("翁志磊");
                //三个学生都订阅了一个事件
                t.ListenerEvent += new Teacher.ListenerEventHandler(stu1.Listener);
                t.ListenerEvent += new Teacher.ListenerEventHandler(stu2.Record);
                t.ListenerEvent += new Teacher.ListenerEventHandler(stu3.Sleep);
                //触发事件
                t.BeginClass();
                Console.ReadKey();
            }
        }
    
    
    

    相关文章

      网友评论

          本文标题:Lession07委托、Lambda表达式、事件

          本文链接:https://www.haomeiwen.com/subject/ebudeltx.html