在 C# 中,委托(Delegate)、Action、Func 和 Event 是非常重要的概念,它们为我们提供了灵活的编程方式,特别是在事件驱动编程和回调机制中有广泛的应用。
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) 是一个类型,代表一个方法的引用。其他所有类型,如
Action
、Func
和Event
,都依赖于委托。
Action 和 Func
- Action 和 Func 都是 C# 提供的通用委托类型,简化了常见的委托用法。
- Action:表示没有返回值的方法。
- Func:表示有返回值的方法。
Event
- Event 是基于委托的机制,用于实现事件驱动编程。它与委托的主要区别在于,事件是由发布者触发,订阅者响应事件,而不能直接调用委托。
6. 总结
名称 | 类型 | 用途 |
---|---|---|
Delegate | 委托类型 | 用于定义方法的引用类型,可以将方法赋给委托变量并调用 |
Action | 委托类型 | 用于没有返回值的方法(Action<T1, T2, ...> ) |
Func | 委托类型 | 用于有返回值的方法(Func<T1, T2, ..., TResult> ) |
Event | 委托机制 | 用于事件驱动编程,通过委托来通知事件发生,支持订阅和触发 |
- 委托(Delegate) 是所有的基础类型,
Action
、Func
和event
都基于委托。 - Action 用于没有返回值的方法。
- Func 用于有返回值的方法。
- Event 是基于委托的机制,通常用于事件驱动编程,支持订阅和触发。
7. 拓展文章
- https://blog.csdn.net/weixin_45034786/article/details/145261103
- https://blog.csdn.net/weixin_45034786/article/details/145261400
- https://blog.csdn.net/che300/article/details/127296828 这个很全面