【C#】委托、Action、Func 和 Event 的关系详解

在 C# 中,委托(Delegate)、ActionFuncEvent 是非常重要的概念,它们为我们提供了灵活的编程方式,特别是在事件驱动编程和回调机制中有广泛的应用。


1. 委托(Delegate)

委托(Delegate) 是 C# 中的一种类型,它代表了一个方法的引用。简言之,委托允许将一个方法赋值给一个变量,然后通过这个变量来调用方法。

委托的定义与使用

在 C# 中,我们可以定义委托类型来指定方法的返回类型和参数类型。定义一个委托的基本语法如下:

public delegate 返回类型 委托名(参数类型1 参数1, 参数类型2 参数2, ...);

例如,定义一个代表两个整数相加的委托:

public delegate int AddDelegate(int x, int y);

然后,我们可以创建委托实例并指向具体方法:

AddDelegate add = (x, y) => x + y;
Console.WriteLine(add(2, 3));  // 输出 5

2. Action(无返回值的委托)

Action 是 C# 中用于表示没有返回值的方法的委托类型。Action 是一种内置的委托类型,无需为每种不同的没有返回值的方法定义新的委托类型。

Action 的定义与使用

  • Action 委托适用于返回类型为 void 的方法。
  • 它可以接受 0 到 16 个参数,参数类型可以自定义。

例如,定义一个没有返回值的方法:

Action<int, int> addAction = (x, y) => Console.WriteLine(x + y);
addAction(2, 3);  // 输出 5

总结Action 用来表示没有返回值的方法。


3. Func(有返回值的委托)

Func 是 C# 中表示有返回值的方法的委托类型。Func 委托的最后一个类型参数指定了方法的返回类型。

Func 的定义与使用

  • Func 委托适用于返回类型不是 void 的方法。
  • 它最多可以有 16 个参数,最后一个参数是返回值类型。

例如,定义一个返回整数的加法方法:

Func<int, int, int> addFunc = (x, y) => x + y;
Console.WriteLine(addFunc(2, 3));  // 输出 5

总结Func 用来表示有返回值的方法。


4. Event(事件)

Event(事件) 是 C# 中的一个重要概念,它基于委托实现,用于事件驱动编程。事件允许类或对象通知其他对象某些操作或状态的变化。

Event 的定义与使用

  • 事件通常与委托类型结合使用。
  • 事件源对象(通常是类)在某些操作发生时触发事件,通知所有订阅了该事件的对象。

例如,定义一个简单的事件,当计数器达到阈值时触发事件:

public delegate void ThresholdReachedEventHandler(object sender, EventArgs e);

public class Counter
{
    
    
    public event ThresholdReachedEventHandler ThresholdReached;

    public void CheckThreshold(int count)
    {
    
    
        if (count >= 10)
        {
    
    
            ThresholdReached?.Invoke(this, EventArgs.Empty);  // 触发事件
        }
    }
}

然后,外部代码可以订阅该事件:

Counter counter = new Counter();
counter.ThresholdReached += (sender, e) => Console.WriteLine("Threshold reached!");
counter.CheckThreshold(10);  // 输出 "Threshold reached!"

总结event 用于事件驱动编程,通过委托来通知事件发生,支持订阅和触发。


5. 委托、Action、Func 和 Event 之间的关系

委托(Delegate)

  • 委托(Delegate) 是一个类型,代表一个方法的引用。其他所有类型,如 ActionFuncEvent,都依赖于委托。

Action 和 Func

  • ActionFunc 都是 C# 提供的通用委托类型,简化了常见的委托用法。
    • Action:表示没有返回值的方法。
    • Func:表示有返回值的方法。

Event

  • Event 是基于委托的机制,用于实现事件驱动编程。它与委托的主要区别在于,事件是由发布者触发,订阅者响应事件,而不能直接调用委托。

6. 总结

名称 类型 用途
Delegate 委托类型 用于定义方法的引用类型,可以将方法赋给委托变量并调用
Action 委托类型 用于没有返回值的方法(Action<T1, T2, ...>
Func 委托类型 用于有返回值的方法(Func<T1, T2, ..., TResult>
Event 委托机制 用于事件驱动编程,通过委托来通知事件发生,支持订阅和触发
  • 委托(Delegate) 是所有的基础类型,ActionFuncevent 都基于委托。
  • Action 用于没有返回值的方法。
  • Func 用于有返回值的方法。
  • Event 是基于委托的机制,通常用于事件驱动编程,支持订阅和触发。

7. 拓展文章

  1. https://blog.csdn.net/weixin_45034786/article/details/145261103
  2. https://blog.csdn.net/weixin_45034786/article/details/145261400
  3. https://blog.csdn.net/che300/article/details/127296828 这个很全面

猜你喜欢

转载自blog.csdn.net/weixin_44918971/article/details/146806214