C# 中的delegate

C# 中的delegate(委托)是一种类型安全的函数指针,它安全地封装了方法的签名和引用。

可以将delegate视为一种可引用的方法类型,类似于C或C++中的函数指针,但比函数指针更安全、更类型安全。

delegate主要用于事件处理、回调方法和异步编程等场景。

委托是一种可以把引用存储为函数的类型。

委托可以引用实例和静态方法,而函数指针只能引用静态方法。

委托的声明非常类似于函数,和函数不同的的是委托不带函数体,并且需要Delegate关键字。

System.Delegate 和“delegate”关键字 - C# | Microsoft Learn

 

定义委托
例如,声明一个接受两个整数并返回它们之和的委托:

public delegate int CalculatorDelegate(int num1, int num2);
实例化委托
定义好委托后,可以创建该委托类型的实例,并将其绑定到符合其签名的方法上:

CalculatorDelegate calculate = AddNumbers; // 假设有一个匹配签名的方法AddNumbers

// 定义匹配签名的方法
private int AddNumbers(int num1, int num2)
{
return num1 + num2;
}
调用委托
一旦委托被赋值给一个方法,就可以像调用普通方法一样调用它:

int result = calculate(5, 7); // 这会执行AddNumbers方法并返回结果

使用Lambda表达式

从C# 3.0开始,你还可以使用Lambda表达式来创建delegate的实例,这使得代码更加简洁。

calculate = (x, y) => x + y;
result = calculate (5, 3); // result is 8

calculate = (x, y) => x - y;
result = calculate (5, 3); // result is 2

多播委托(组合多个方法)
委托还可以指向多个方法,当调用时,所有关联的方法都会按照添加顺序依次执行:

CalculatorDelegate combined = AddNumbers;
combined += SubtractNumbers;

// 调用会先执行AddNumbers,再执行SubtractNumbers
int finalResult = combined(10, 3);

泛型委托
C#中预定义了几个常用的泛型委托,如Action, Func 和 Predicate,简化了常见场景下的委托使用。

Action<T>:用于表示没有返回值并且带任意数量输入参数的方法。
Func<TResult>:用于表示具有返回值和任意数量输入参数的方法。
Predicate<T>:用于表示返回布尔值且仅有一个输入参数的方法。

在事件中使用Delegate
delegate在事件处理中特别有用。你可以定义一个delegate类型来表示事件处理程序,然后在类中声明一个该类型的事件。当事件发生时,所有订阅了该事件的处理程序都会被调用。

 

事件(Event)与委托的关系
在C#中,事件是基于委托的实现,用于发布/订阅模型。类通常通过定义一个委托类型来声明事件,然后其他对象可以“订阅”这个事件,即添加处理方法到事件的委托引用列表中。

public event CalculatorDelegate CalculationPerformed;

protected virtual void OnCalculationPerformed(int result)
{
CalculationPerformed?.Invoke(result, EventArgs.Empty); // 触发事件
}

异步编程中的委托
在异步编程中,委托还常用于BeginInvoke/EndInvoke模式或Task类的ContinueWith等方法,以实现非阻塞的异步操作。

以上就是C#中委托的基本使用方式,实际应用中,委托是构建事件驱动程序、回调机制以及实现灵活方法调用的核心工具之一。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/wangnaisheng/article/details/136677562

posted @ 2024-06-25 15:10  春天又来了  阅读(175)  评论(0编辑  收藏  举报