C#基础-委托与事件

委托

delegate是申明委托的关键字
返回类型都是相同的,并且参数类型个数都相同

委托声明

delegate double DelOperater(double num1, double num2);

实例化委托对象

class Program
{
    static void Main(string[] args)
    {
       DelOperater delOp = new DelOperater(Add);
    }

    static double Add(double a,double b)
    {
        return a + b;
    }
}

委托的调用

double r1 = delOp.Invoke(3, 5);     // 第一种方法
double r2 = delOp(3, 5);            // 第二种方法

委托增加指向方法

delOp += new DelOperater(Sub);  // 减法被传递进来

委托去除指向方法

delOp -= new DelOperater(Sub);  // 减法被移出去

案例:关于加减乘除的委托,它的返回值都是double类型,并且都有两个double的参数

namespace ConsoleApp7
{
    // delegate是申明委托的关键字
    // 关于加减乘除的委托,它的返回值都是double类型,并且都有两个double的参数
    delegate double DelOperater(double num1, double num2);
    class Program
    {
        static void Main(string[] args)
        {
            // 使用委托的时候需要实例化委托对象
            // 在实例化委托时,会把方法名作为一个参数传进来,
            DelOperater delOp = new DelOperater(Add);
            // 在调用委托时,实际上调用的是委托指向的方法
            double r1 = delOp.Invoke(3, 5);
            Console.WriteLine("委托调用的方法的执行结果:" + r1);
            double r2 = delOp(3, 5);
            Console.WriteLine("委托调用的方法的执行结果:" + r2);
            delOp += new DelOperater(Sub);  // 减法被传递进来
            double r3 = delOp.Invoke(3, 5);
            Console.WriteLine("委托调用的方法的执行结果:" + r3);
            double r4 = delOp(3, 5);
            Console.WriteLine("委托调用的方法的执行结果:" + r4);
        }

        static double Add(double a,double b)
        {
            return a + b;
        }
        static double Sub(double a,double b)
        {
            return a - b;
        }
    }
}

事件

事件定义的方法

// 定义一个事件,就是委托的实例对象
public static event DelSendMsg sendEvent;

做一个案例:

需要写两个类。MoblieServer和MobileClient
手机服务器端

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

namespace ConsoleApp7
{
    // 手机服务器端
    public delegate void DelSendMsg(string msg);
    class MobileServer
    {
        // 定义一个事件,就是委托的实例对象
        public static event DelSendMsg sendEvent;

        // 将服务器推送到客户端方法
        public void SendMsg(string msg)
        {
            Console.WriteLine("服务器给客户端手机发送消息");
            // 如果客户端订阅了该事件
            if (sendEvent != null)
            {
                sendEvent(msg);// 事件的执行,事件的执行实践上关联到具体事件绑定的方法的执行
            }
        } 
    }
}

手机客户端

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

namespace ConsoleApp7
{
    // 手机客户端
    class MobileClient
    {
        // 客户端订阅服务器端推送消息功能
        public void Dingyue()
        {
            Console.WriteLine("手机客户端已经订阅了服务端订阅消息");
            MobileServer.sendEvent += new DelSendMsg(mobServer_sendEvent);
        }

        private void mobServer_sendEvent(string msg)
        {
            Console.WriteLine("这是客户端接收到服务器端推送的消息:"+msg);
        }
    }
}

主程序

class Program
{
    static void Main(string[] args)
    {
        MobileServer moserver = new MobileServer();
        MobileClient moclient = new MobileClient();
        moclient.Dingyue();
        moserver.SendMsg("今天天气晴朗");
    }
}

效果如下:

posted @ 2019-04-08 18:26  cicarius  阅读(192)  评论(0编辑  收藏  举报