编辑
2025-09-23
C#
00

目录

定义委托
示例:定义一个简单的委托
使用委托
示例:使用委托
委托的多播
示例:多播委托
委托与匿名方法和 Lambda 表达式
示例:使用匿名方法
示例:使用 Lambda 表达式
委托作为事件处理器
示例:委托作为事件处理器
总结
中的事件和回调机制至关重要。

在 C# 中,委托是一种类型,它定义了方法的签名(即方法的参数和返回类型),并且可以持有对符合该签名的方法的引用。简而言之,委托是对方法的封装,它允许将方法作为参数传递,或者将方法赋给变量。

委托特别适用于实现回调方法和多播功能。它们在事件处理中也起着核心作用。

定义委托

委托的定义类似于定义一个方法,但是使用 delegate 关键字,并且没有方法体。

示例:定义一个简单的委托

C#
public delegate void PrintDelegate(string message);

在这个例子中,我们定义了一个委托 PrintDelegate,它可以引用任何接受单个 string 参数并返回 void 的方法。

使用委托

要使用委托,首先需要定义一个符合委托签名的方法,然后创建委托的实例,并将该方法作为参数传递给委托。

示例:使用委托

C#
namespace AppDelegate { internal class Program { public delegate void PrintDelegate(string message); static void Main() { // 定义一个符合委托签名的方法 void PrintToConsole(string message) { Console.WriteLine(message); } // 创建委托实例并传递方法 PrintDelegate printDelegate = new PrintDelegate(PrintToConsole); // 使用委托调用方法 printDelegate("Hello, World!"); Console.ReadKey(); } } }

image.png

在上面的代码中,我们首先定义了一个名为 PrintToConsole 的方法,它符合 PrintDelegate 委托的签名。然后我们创建了一个 PrintDelegate 的实例,并将 PrintToConsole 方法作为参数传递给它。最后,我们通过调用委托来执行 PrintToConsole 方法。

委托的多播

委托可以指向多个方法,这称为多播委托。当调用多播委托时,它会按照添加到委托的顺序调用每个方法。

示例:多播委托

C#
using System.Diagnostics; namespace AppDelegate { internal class Program { public delegate void PrintDelegate(string message); static void Main() { void PrintToConsole(string message) { Console.WriteLine("Console: " + message); } void PrintToDebug(string message) { Console.WriteLine("Debug: " + message); } PrintDelegate printDelegate = PrintToConsole; printDelegate += PrintToDebug; // 添加第二个方法 // 调用多播委托 printDelegate("Hello, Multicast!"); Console.ReadKey(); } } }

image.png

在这个例子中,我们创建了一个 PrintDelegate 的实例,并将两个方法 PrintToConsolePrintToDebug 添加到委托中。当我们调用 printDelegate 时,这两个方法将按照添加的顺序被调用。

委托与匿名方法和 Lambda 表达式

委托可以与匿名方法和 Lambda 表达式一起使用,这使得代码更加简洁。

示例:使用匿名方法

C#
using System.Diagnostics; namespace AppDelegate { internal class Program { public delegate void PrintDelegate(string message); static void Main() { PrintDelegate printDelegate = delegate (string message) { Console.WriteLine("Anonymous: " + message); }; printDelegate("Hello, Anonymous!"); Console.ReadKey(); } } }

在这个例子中,我们使用了匿名方法来创建 PrintDelegate 的实例。

示例:使用 Lambda 表达式

现在看来这种用的是最多的了,毕竟最为简洁

C#
using System.Diagnostics; namespace AppDelegate { internal class Program { public delegate void PrintDelegate(string message); static void Main() { PrintDelegate printDelegate = message => Console.WriteLine("Lambda: " + message); printDelegate("Hello, Lambda!"); Console.ReadKey(); } } }

在这个例子中,我们使用了 Lambda 表达式来创建 PrintDelegate 的实例。Lambda 表达式提供了一种更简洁的方式来写匿名方法。

委托作为事件处理器

委托通常用于事件处理,事件说白了就是委托的回调用。我们可以定义一个委托来表示事件处理程序的签名,然后将该委托类型用于事件。

示例:委托作为事件处理器

C#
using System.Diagnostics; namespace AppDelegate { public class Button { // 定义事件处理器委托 public delegate void ClickHandler(object sender, EventArgs e); // 定义事件 public event ClickHandler Clicked; // 触发事件的方法 public void OnClick() { Clicked?.Invoke(this, EventArgs.Empty); } } internal class Program { static void Main() { var button = new Button(); // 订阅事件 button.Clicked += Button_Clicked; // 模拟按钮点击 button.OnClick(); Console.ReadLine(); } private static void Button_Clicked(object sender, EventArgs e) { Console.WriteLine("Button was clicked!"); } } }

image.png

在这个例子中,我们定义了一个 Button 类,它有一个名为 Clicked 的事件,使用了 ClickHandler 委托类型。在 Program 类中,我们订阅了这个事件,并提供了一个事件处理器 Button_Clicked

总结

委托是 C# 中一个非常有用的功能,它允许我们将方法作为参数传递,创建多播委托,并用于事件处理。通过使用匿名方法和 Lambda 表达式,我们可以以更简洁的方式使用委托。掌握委托对于理解和使用 C# 中的事件和回调机制至关重要。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!