Lession07 委托、事件、匿名方法和lambda表达式

委托:

 /*
     * 委托是一种数据类型(既然是数据类型,就可以定义变量),就是用来存储方法的
     * 语法:[访问修饰符] delegate 返回类型 委托名();
     * 
     * 
     */

using System;

namespace ConsoleApp1    //委托
{
    /*
    * 委托是一种数据类型(既然是数据类型,就可以定义变量),就是用来存储方法的
    * 语法:[访问修饰符] 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方法
            M1();
            Console.WriteLine("------------------");
            //实例化MachCal类
            MachCal mc = new MachCal();
            //实例化委托
            CallBack cb = new CallBack(mc.Plus);
            //调用这个委托
            int res = cb(10, 20);
            Console.WriteLine();
            Console.WriteLine("res的值是:{0}", res);

            Console.ReadKey();
        }
        static void M1()
        {
            Console.WriteLine("我是一个没有返回值没有参数的方法");
        }
    }
    //定义委托
    //定义了一个委托类型,用来保存无参数,无返回值的方法
    //定义了一个名字叫MyDelegate的类型,并且这个类型是个委托,而且只能存储
    //没有返回值,没有参数的方法
    //委托要定义在命名空间中和类是同一级别
    public delegate void MyDelegate();
    //定义一个MyClass的一个类型
    public class Myclass
    {

    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp1           //委托
{
    //1.定义委托
    public delegate int CallBack(int n1,int n2);
    class MachCal
    {
        //两个整数类型相加
        public int Plus(int num1,int num2)
        {
            return num1 + num2;
        }
        //两个整数类型相减
        public int Minus(int num1,int num2)
        {
            return num1 - num2;
        }

    }
}

 

 

 事件:

 /*
     * 事件是基于委托
     * C#中事件的处理步骤
     * 1.定义事件
     * [访问修饰符] event 委托名 事件名
     * 2.订阅事件
     * 事件名 += new 委托(事件处理方法名)
     * 3.事件发生时,通知订阅者发生的事件
     * 事件名([参数列表]);
     * 
     */

//1.定义一个委托和一个事件
        public delegate void Study();
        public event Study StudyEvent;
using System;

namespace ConsoleApp1     //事件
{
    /*
    * 事件是基于委托
    * C#中事件的处理步骤
    * 1.定义事件
    * [访问修饰符] event 委托名 事件名
    * 2.订阅事件
    * 事件名 += new 委托(事件处理方法名)
    * 3.事件发生时,通知订阅者发生的事件
    * 事件名([参数列表]);
    * 
    */
    public class Teacher
    {//写在事件源里
        //1.定义一个委托和一个事件
        public delegate void Study();
        public event Study StudyEvent;
        public void Beginclass()
        {
            Console.WriteLine("开始上课啦");
            if (StudyEvent !=null)
            {
                StudyEvent();//引发事件
            }
        }

    }
    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);
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Teacher t = new Teacher();
            Student s1 = new Student("李腾");
            Student s2 = new Student("赵文凤");
            //2.订阅事件
            t.StudyEvent += new Teacher.Study(s1.Listener);
            t.StudyEvent += new Teacher.Study(s2.Record);
            //触发事件
            t.Beginclass();
            Console.ReadKey();
        }
    }
}

匿名方法和lambda表达式:

 /*
     * 1.委托是一种数据类型,像类一样的一种数据类型,一般都是直接在命名空间中定义
     * 2.定义委托时,需要指明返回值类型,委托名于参数列表,这样就能确定该类型能存储什么样的方法
     * 3.使用委托:
     *         a.声明委托变量
     *         b.委托是个引用类型,像类一样,所以声明委托变量后,如果不赋值则该委托变量为null
     *         所以使用委托变量前最好做非空校验weituo!=null
     *         c.委托类型的变量只能赋值一个委托类型的对象
     * 
     * 匿名方法:
     * 不能直接在类中定义,而是在给委托变量赋值的时候,需要赋值一个方法,此时可以“现做现卖”,
     * 定义一个匿名方法传递给该委托
     * 
     * 语法:
     * 委托类型 委托实例 = delegate([参数列表]){
     *      代码块
     * };
     *
     *lambda表达式
     *委托类型 委托实例=([参数])=>{代码块};
     */

using System;

namespace  ConsoleApp1              //匿名方法和Lambda表达式
{
    /*
    * 1.委托是一种数据类型,像类一样的一种数据类型,一般都是直接在命名空间中定义
    * 2.定义委托时,需要指明返回值类型,委托名于参数列表,这样就能确定该类型能存储什么样的方法
    * 3.使用委托:
    *         a.声明委托变量
    *         b.委托是个引用类型,像类一样,所以声明委托变量后,如果不赋值则该委托变量为null
    *         所以使用委托变量前最好做非空校验weituo!=null
    *         c.委托类型的变量只能赋值一个委托类型的对象
    * 
    * 匿名方法:
    * 不能直接在类中定义,而是在给委托变量赋值的时候,需要赋值一个方法,此时可以“现做现卖”,
    * 定义一个匿名方法传递给该委托
    * 
    * 语法:
    * 委托类型 委托实例 = delegate([参数列表]){
    *      代码块
    * };
    *
    *lambda表达式
    *委托类型 委托实例=([参数])=>{代码块};
    */
    class Program
    {
        static void Main(string[] args)
        {
            //MyDelegate md = M1;
            MyDelegate md = new MyDelegate(M1);
            md();
            //无参数,无返回值的一个匿名方法
            MyDelegate md1 = delegate ()
            {
                Console.WriteLine("hello,这是一个无参数无返回值的匿名方法写的");
            };
            md1();
            Console.WriteLine("-------------");
            //有参数,无返回值的匿名方法
            MyDelegate2 md2 = delegate (string mgs)
            {
                Console.WriteLine("早上好,{0}", mgs);
            };
            md2("海龙");
            //有参数,无返回值的lambda表达式
            MyDelegate2 md22 = m =>
            {
                Console.WriteLine("中午好,{0}", m);
            };
            md22("干饭吧");
            Console.WriteLine("--------------");
            //有参数,有返回值的匿名方法
            AddDelegate a1 = delegate (int n1, int n2, int n3)
            {
                return n1 + n2 + n3;
            };
            Console.WriteLine("三个整数类型的值的和是{0}", a1(10, 20, 30));
            //有参数,有返回值的lambda表达式
            AddDelegate a2 = (n1, n2, n3) =>
            {
                return n1 + n2 + n3;
            };
            Console.WriteLine("三个整数类型的值的和是{0}", a2(20, 30, 50));

            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);
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞鹰@四海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值