image-bczi.png

在C#中,委托(Delegate)和事件(Event)是两个重要的概念,它们通常用于实现事件驱动编程和回调机制。

委托定义:

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

委托是一个安全的函数指针,.NET中的委托是类型安全的,委托会检测它所保存的函数引用是否和声明的委托匹配。

委托种类:3种

Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型

Func可以接受0个至16个传入参数,必须具有返回值

Action可以接受0个至16个传入参数,无返回值

代码示例:
1.Delegate 类型:

using System;

// 定义委托
public delegate void MyDelegate(string message);

// 使用委托
public class DelegateExample
{
    public void ShowMessage(string message)
    {
        Console.WriteLine("Message: " + message);
    }

    public static void Main()
    {
        // 实例化委托并绑定方法
        MyDelegate myDelegate = new MyDelegate(new DelegateExample().ShowMessage);
        // 调用委托
        myDelegate("Hello, World!");
    }
}

2. Func 泛型委托:
Func 委托是一个带有返回值的泛型委托,可以接受多个参数。

using System;

public class FuncExample
{
    public static void Main()
    {
        // 使用Func委托
        Func<int, int, int> add = (a, b) => a + b;

        // 调用Func委托
        int result = add(5, 10);
        Console.WriteLine("Result: " + result);
    }
}

3. Action 泛型委托:
Action 委托是一个不带返回值的泛型委托,也可以接受多个参数。

using System;

public class ActionExample
{
    public static void Main()
    {
        // 使用Action委托
        Action<string> printMessage = (message) => Console.WriteLine("Message: " + message);

        // 调用Action委托
        printMessage("Hello, Action!");
    }
}

事件(Event):

功能作用:

事件是一种特殊的委托,用于实现发布-订阅模式,允许对象在特定的情况下通知其他对象。
主要用于实现回调函数、处理用户界面交互等。

// 定义事件委托
public delegate void MyEventHandler(object sender, EventArgs e);

// 定义包含事件的类
public class MyEventClass
{
    public event MyEventHandler MyEvent;

    // 触发事件的方法
    public void RaiseEvent()
    {
        MyEvent?.Invoke(this, EventArgs.Empty);
    }
}

// 订阅事件的方法
public class EventSubscriber
{
    public void HandleEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Event handled by EventSubscriber");
    }
}

// 使用事件
MyEventClass myObject = new MyEventClass();
EventSubscriber subscriber = new EventSubscriber();

// 订阅事件
myObject.MyEvent += subscriber.HandleEvent;

// 触发事件
myObject.RaiseEvent();

可以参考博主之前写的订阅器,在项目中的使用:
https://blog.csdn.net/zuiyuewentian/article/details/135043706

相同点:

  • 都基于委托: 事件本质上是一种特殊的委托,事件声明和使用都依赖于委托类型。

  • 都支持多播: 委托和事件都支持多个方法的绑定,可以同时调用多个方法。

不同点:

  • 语法和用途: 委托用于直接调用方法或实现回调,而事件更多用于实现发布-订阅模式,让对象在状态改变时通知其他对象。

  • 封装性: 事件具有更高的封装性,外部类不能直接调用触发事件的方法,而委托没有这种封装性。

  • 事件在类中声明,委托可在任何地方声明和使用。