C# 委托

2025年9月12日 | 阅读 7 分钟

在 C# 编程语言中,委托(delegate)是一种引用类型变量,它持有对方法的引用。它的功能类似于 C 和 C++ 中的函数指针。它提供了一种更安全、类型安全且面向对象的方法。它允许将方法作为参数传递、赋值给变量,并在运行时动态调用。它是 C# 编程语言中最强大和最常见的特性之一,用于实现事件。

C# Delegates

在 C# 中,委托可以封装静态方法和实例方法。在内部,委托声明定义了一个继承自 `System.Delegate` 的类。

委托的声明

可以使用 `delegate` 关键字以及方法签名来声明委托类型。如果我们声明了一个委托,委托实例将引用并调用那些具有与委托声明相同的返回类型和参数列表的方法。

语法

它具有以下语法:

在这个语法中,

  • 修饰符:它表示定义委托可见性的访问修饰符。
  • delegate:它表示定义委托的关键字。
  • return_type:它表示方法返回的值类型。
  • delegate_name:用于表示委托的名称。
  • parameter_list:它表示必须分配给委托的方法的参数列表。

实例化委托

在 C# 中声明了委托后,我们可以通过赋值一个(使用 `new` 关键字)签名匹配的方法来实例化它。这允许我们通过委托实例间接调用该方法。

语法

它具有以下语法。

C# 委托示例

让我们举一个例子来说明 C# 中的委托。

示例

编译并运行

输出

Hello, Albert

说明

在这个例子中,我们有一个名为 `MyDel` 的委托,它包含一个接受字符串参数的 `Point()` 方法。之后,`Point()` 方法匹配此签名并打印消息。在 `main` 方法中,委托被实例化为 `Point` 方法,并调用 `Point()` 方法来打印输出。

将委托作为参数传递

在 C# 编程语言中,我们可以将委托作为参数传递给方法。这允许执行委托引用的方法。完成此操作后,我们可以定义一个灵活且可重用的方法,该方法可以接受不同的函数作为参数。

C# 将委托作为参数传递的示例

让我们举一个例子来说明在 C# 中使用传递参数的委托。

示例

编译并运行

输出

Welcome to TPointTech, David

说明

在这个例子中,我们有一个名为 `My_Del` 的委托,它包含 `Say()` 方法。`Say()` 方法匹配此委托并打印一条消息。`GreetUser()` 方法接受一个委托和一个字符串。在 `main` 方法中,我们创建一个委托实例并将其赋值给 `Say()` 方法,然后我们将此委托连同名称“David”一起传递给 `GreetUser()`。最后,我们调用 `Say()` 方法并打印消息。

多播委托

在 C# 编程语言中,多播委托(multicast delegate)是一种特殊的委托类型,它可以同时持有对多个方法的引用。当调用委托时,它会逐个执行所有方法。它对于使用单个委托调用多个函数很有用。所有方法必须具有相同的签名和返回类型。

C# 多播委托示例

让我们举一个例子来说明 C# 中的多播委托。

示例

编译并运行

输出

Welcome to TPointTech, David
Welcome to TPointTech, David

说明

在这个例子中,我们有一个名为 `My_Del` 的委托,它包含字符串参数以及两个方法 `SayHello()` 和 `Say()`。在 `main` 方法中,我们创建了两个实例 `d1` 和 `d2`,它们被赋值给 `Say` 方法,然后我们使用多播委托实例来打印输出。

泛型委托

C# 中的泛型委托(generic delegate)是一种使用类型参数定义的委托类型,它能够处理任何类型的数据。我们也可以定义一个不固定数据类型的委托,这使得代码更加灵活和可重用。

C# 泛型委托示例

让我们举一个例子来说明 C# 中的泛型委托。

示例

编译并运行

输出

The square of a number is 25
Welcome, Alice

说明

在这个例子中,我们有一个泛型委托 `MyDel`,它包含一个类型为 `T` 的参数,并返回相同类型的值。在 `main` 方法中,我们创建了两个委托实例:一个用于 `int` 类型,通过 `Sq` 方法计算数字的平方;另一个用于 `string` 类型,通过 `Greet` 方法向用户打招呼,并返回欢迎消息。

内置委托

下表显示了 C# 中可用的预定义泛型委托。

Delegate描述示例
Action<T>它定义了一个接受参数但返回 `void` 的方法。Action<string> greet = name => Console.WriteLine("Hello, " +name); 
Func<T, TResult>它表示一个接受参数并有返回类型的方法。Func<int, int, int> add = (m, n) => m + n;
Predicate<T>它表示一个接受参数并返回 `Boolean` 类型的方法。Predicate<int> isEven = x => x % 2 == 0;

委托的重要注意事项

C# 委托有几个重要的注意事项。其中一些如下:

  • 委托提供了一种方便的方式来封装方法并将它们视为对象。
  • 它在 `System` 命名空间中定义为类类型。
  • 它们主要用于实现回调方法和事件处理。
  • 委托可用于调用匿名方法。
  • 通过将委托链接在一起,委托可以调用多个方法。

结论

总之,委托是一种持有方法引用的类型。它允许将方法作为参数传递、赋值给变量,并在运行时动态调用。它是委托中最强大和最常见的特性之一,用于处理事件。它使得代码模块化、可重用且易于维护。

C# 委托常见问题解答

1) C# 中的委托是什么?

委托是 C# 中的一种类型安全的函数指针,它持有对方法的引用。它提供了一种更安全、类型安全且面向对象的方法。它在 `System` 命名空间中定义为类类型。

2) 为什么要在 C# 中使用委托?

在 C# 中,委托是一种持有方法引用的类型。它有助于使代码更灵活且易于更改。它允许在稍后执行方法。

3) C# 中的泛型委托是什么?

C# 中的泛型委托是一种使用类型参数定义的委托类型,它能够处理任何类型的数据。它允许我们定义一个不固定数据类型的委托。这使得代码更加灵活和可重用。

4) 如何在 C# 中调用委托?

在 C# 中,委托的调用方式与其名称后跟括号,这类似于调用常规方法。如果委托有参数,则将它们作为参数传递。

示例: myDelegate(); 或 myDelegate(10);

5) 定义 C# 中的多播委托?

多播委托是一种特殊的委托类型,它可以同时持有多个方法。当调用委托时,它会逐个执行所有方法。它对于使用单个委托调用多个函数很有用。所有方法必须具有相同的签名。

6) 我们可以在 C# 中将 Lambda 表达式与委托一起使用吗?

是的,我们可以在 C# 中将 Lambda 表达式与委托一起使用。


下一个主题C# 反射