• 详解C#委托与事件


    image

    在C#中,委托是一种引用类型的数据类型,允许我们封装方法的引用。通过使用委托,我们可以将方法作为参数传递给其他方法,或者将多个方法组合在一起,从而实现更灵活的编程模式。委托类似于函数指针,但提供了类型安全和垃圾回收等现代语言特性。

    基本概念

    定义委托

    定义委托需要指定它所代表的方法的原型,包括返回类型和参数列表。例如:

    public delegate int MyDelegate(int a, int b);
    

    这定义了一个名为MyDelegate的委托,它代表一个接受两个整数参数并返回一个整数的方法。

    创建委托实例

    创建委托实例时,可以使用new关键字加上委托类型和要封装的方法名:

    MyDelegate myDelegate = new MyDelegate(AddNumbers);
    

    其中AddNumbers是一个符合MyDelegate定义的方法。

    调用委托

    一旦有了委托实例,就可以像调用方法一样调用它:

    int result = myDelegate(5, 3);
    

    多播委托

    委托可以被设计为“多播”的,这意味着它们可以调用多个方法。当调用多播委托时,所有注册的方法都会按顺序执行:

    MyDelegate del1 = new MyDelegate(AddNumbers);
    MyDelegate del2 = new MyDelegate(MultiplyNumbers);
    MyDelegate combinedDel = del1 + del2;
    combinedDel(5, 3); // 先调用 AddNumbers, 然后调用 MultiplyNumbers
    

    匿名方法和Lambda表达式

    从C# 2.0开始,可以使用匿名方法来定义委托:

    MyDelegate anonMethod = delegate(int x, int y) { return x + y; };
    

    而在C# 3.0之后,Lambda表达式成为更简洁的选择:

    MyDelegate lambdaExpr = (int x, int y) => x + y;
    

    事件

    在C#中,事件是一种特殊的委托类型,用于封装消息的发送机制,通常用于组件之间或对象之间的通信。事件是.NET框架中处理异步操作、UI交互和信号通知的核心机制。下面详细介绍事件的概念、定义和使用。

    事件的基本概念

    事件允许一个类(事件发布者)向另一个或多个类(事件订阅者)广播信息,而无需直接调用接收方的任何方法。这实现了发布者和订阅者之间的解耦,使得代码更加模块化和可维护。

    定义事件

    事件基于委托类型定义,通常使用System.EventHandler或自定义的委托类型。定义事件时,通常在类中声明一个委托类型的私有字段,并在此基础上声明一个公共的事件属性。例如:

    public class Publisher
    {
        // 自定义委托类型
        public delegate void MyEventHandler(object source, MyEventArgs args);
    
        // 定义事件
        private event MyEventHandler myEvent;
    
        // 使用事件属性暴露事件
        public event MyEventHandler MyEvent
        {
            add { myEvent += value; }
            remove { myEvent -= value; }
        }
    
        // 触发事件
        public void RaiseEvent()
        {
            if (myEvent != null)
            {
                myEvent(this, new MyEventArgs());
            }
        }
    }
    

    在这个例子中,Publisher类有一个名为MyEvent的事件,它基于MyEventHandler委托类型。事件触发时,RaiseEvent方法会被调用,它会检查是否有订阅者,并调用所有订阅者的相应方法。

    订阅和取消订阅事件

    事件可以通过事件处理程序来订阅。事件处理程序是一个与事件委托类型匹配的方法。订阅事件时,将事件处理程序添加到事件中;取消订阅则移除该处理程序。

    class Subscriber
    {
        public void OnMyEvent(object sender, MyEventArgs e)
        {
            Console.WriteLine("Event triggered.");
        }
    }
    
    // 在某个地方订阅事件
    Publisher publisher = new Publisher();
    Subscriber subscriber = new Subscriber();
    publisher.MyEvent += subscriber.OnMyEvent;
    
    // 取消订阅事件
    publisher.MyEvent -= subscriber.OnMyEvent;
    

    使用事件参数

    事件经常与事件参数一起使用,这些参数通常封装了事件发生时的附加信息。事件参数是通过继承EventArgs类来创建的。例如:

    public class MyEventArgs : EventArgs
    {
        public string Message { get; set; }
    }
    

    在触发事件时,可以创建事件参数的实例并传递给事件:

    public void RaiseEvent()
    {
        if (myEvent != null)
        {
            myEvent(this, new MyEventArgs { Message = "Hello, world!" });
        }
    }
    
  • 相关阅读:
    世微LED 大功率升压恒流驱动芯片 平板显示LED背光板灯串恒流控制器 AP9193
    Gerrit Supported Hooks
    这份企业智能应用宝典,请收好~
    kubectl 声明式资源管理方式
    Java高级——解释执行
    人工智能:人工神经网络的应用场景
    多电商平台订单整合,库存同步ERP系统,为何不用电商API对接?
    Asp.net core Web Api 配置swagger中文
    ZYNQ 程序编译
    最「难搞」的英伟达也开源了,下一个会是谁?
  • 原文地址:https://www.cnblogs.com/ayic/p/18295844