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

微信公众号已开通,搜索微信公众号:程序喵星人。点击关注^_^

11.事件和委托

  1.委托定义

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

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

      delegate void MyDel(int x);

    创建委托对象

           委托类型 变量

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

  

  2.事件

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("这是一个消息事件");
        }
    }
}