【原创】C#零基础学习笔记011-事件和委托

其他路径:

CSDN: https://blog.csdn.net/wodehao0808

微信公众号:程序喵星人

更多资源和视频教程,QQ:1902686547

11 事件和委托

11.1 委托定义

  委托和类一样,是一种用户自定义的类型(所以也是引用类型)。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列的预定义操作。

  委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型的对象之前声明。

    delegate void MyDel(int x);

  创建委托对象

     委托类型 变量

11.1.1 Example: 委托的定义和实现

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

// 委托的定义和实现

namespace Lesson_40_1

{

    // 声明一个委托:关于加减乘除,它的返回类型都是double类型,并且参数都有两个参数且是double类型

    // delegate 是声明委托的关键字

    // 语法:delegate 返回类型 委托名字([参数列表])

    delegate double DelOperator(double num1, double num2);

    class Program

    {

        static void Main(string[] args)

        {

            // 使用委托的时候,需要实例化一个委托对象,参数是方法名

            DelOperator delOp = new DelOperator(add);

            // 在调用委托的时候,实际上调用的是委托所指向的这个方法

            //double result = delOp.Invoke(3, 5);

            double result = delOp(3, 5);

            Console.WriteLine("委托调用的方法的执行结果:" + result);

            // 添加和移除新的委托方法

            delOp += new DelOperator(div);  // 委托添加一个指向的方法

            result = delOp(3, 5);

            Console.WriteLine("添加div委托后,结果:" + result);

            delOp -= new DelOperator(div);  // 委托移除指向的方法

            result = delOp(3, 5);

            Console.WriteLine("移除div委托后,结果:" + result);

        }

        static double add(double a, double b)

        {

            return a + b;

        }

        static double div(double c, double d)

        {

            return c - d;

        }

    }

}

11.2 事件

11.2.1 Exampale: 事件

MobileServer.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Lesson_41_1

{

    // 手机服务端的类

    public delegate void DelSendMsg(string p_msg);

    public class MobileServer

    {

        // 事件是委托对象的实例

        public static DelSendMsg delegateSendMsg;

        // 有一个方法,就是将服务端的消息推送给客户端的方法。

        public void sendMsg(string p_msg)

        {

            Console.WriteLine("服务端开始给客户端的手机发送推送的消息");

            // 如果客户端已经订阅了该事件

            if (delegateSendMsg != null)

            {

                // 事件的执行,事件的执行是关联到具体的事件绑定的方法的执行。

                delegateSendMsg(p_msg); 

            }

        }

    }

}

MobileClient.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Lesson_41_1

{

    // 手机客户端

    public class MobileClient

    {

        public void dingYue()

        {

            Console.WriteLine("手机客户端已经订阅了服务端的推送消息");

            MobileServer.delegateSendMsg = new DelSendMsg(mobileServer_sendEvent);

        }

        void mobileServer_sendEvent(string p_msg)

        {

            Console.WriteLine("这是客户端手机接收到服务端推送的消息");

            Console.WriteLine("服务端推送的消息是:" + p_msg);

        }

    }

}

Program.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

// 事件

namespace Lesson_41_1

{

    class Program

    {

        static void Main(string[] args)

        {

            MobileClient mclient = new MobileClient();

            mclient.dingYue();

            MobileServer mserver = new MobileServer();

            mserver.sendMsg("这是一个消息事件");

        }

    }

}