面向对象特性(11)-- 委托和事件2

面向对象特性(11)-- 委托和事件2

编码文章call10242025-04-15 10:58:3122A+A-

1、事件和委托的含义

1.1委托

  • C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。它本质上也是一个类。
  • 它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法。

1.2事件

  • 事件由对象引发,通过我们提供的代码来处理。一个事件我们必须订阅(Subscribe)他们,订阅一个事件的含义就是提供代码,在这个事件发生时执行这些代码,这些代码称为事件处理程序。
  • 事件是在委托类型变量前加上 event 关键字,其本质是用来对委托类型的变量进行封装,类似于类的属性对字段的封装。

2、委托和事件的作用

2.1委托

可以把方法当参数传递,可以避免在程序中大量使用 if-else(switch) 语句,同时使得程序具有更好的可扩展性。C#2.0 之后出现了 匿名函数 和 lambda表达式 也是 Delegate 演化而来。

2.2事件

事件的使用一般通过发布者和订阅者来进行。发布者会在某一条件下触发某事件,订阅者可以通过订阅该事件,来对该事件的触发做出反应。比如,设计模式中的观察者模式.

2.3委托和事件的区别

  • 1、事件是委托的封装 —— 是一种特殊的委托。
  • 2、事件里面其实就是两个方法(即 add_event() 和 remove_event())和一个私有的委托变量,这两个方法里面分别是对这个私有的委托变量进行的合并和移除,当调用事件的 += 时其实是调用的事件里面的 add_event() 方法,同样 -= 调用的是 remove_event() 方法。
  • 3、在注册和注销事件上:(1)委托可以使用 = 和 += 来将函数注册到委托的变量上,使用 -= 来将函数注销。(2)事件则有着更严格的限制,事件只能使用 += 来将函数注册到其上,使用 -= 来将函数注销。

3、用委托实现事件的测试

(1)使用者订阅消息,有消息发布的时候,消息会发布发送回来,简单的示意图如下图所示。


(2)使用委托Action实现的消息订阅简单示例如下所示


public class MessageHandle
{
    //定义了一个委托
    public Action? onMessage;
   //执行委托的函数,最后发布消息用到
    public  void Receive(string message)
    {
        if (onMessage != null)
            onMessage(message);
    }
}

public class User1
{
    public void Receive(string msg)
    {
        Console.WriteLine("User1 收到消息:" + msg);
    }

    public User1(MessageHandle messageHandle)
    {
        messageHandle.onMessage += Receive;
    }
}

public class User2
{
    public void Receive(string msg)
    {
        Console.WriteLine("User2 收到消息:" + msg);
    }
    public User2(MessageHandle messageHandle)
    {
        messageHandle.onMessage += Receive;
    }
}

class demo
{
    static void Main(string[] args)
    {
        MessageHandle messageHandle = new MessageHandle();
        User1 user1 = new User1(messageHandle);
        User2 user2 = new User2(messageHandle);

        messageHandle.Receive("回家吃饭了");
        messageHandle.Receive("回家睡觉了");
    }
}

(3)结果如下图所示

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4