在 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();
}
}
}
在上面的代码中,我们首先定义了一个名为 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();
}
}
}
在这个例子中,我们创建了一个 PrintDelegate
的实例,并将两个方法 PrintToConsole
和 PrintToDebug
添加到委托中。当我们调用 printDelegate
时,这两个方法将按照添加的顺序被调用。
委托可以与匿名方法和 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
的实例。
现在看来这种用的是最多的了,毕竟最为简洁
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!");
}
}
}
在这个例子中,我们定义了一个 Button
类,它有一个名为 Clicked
的事件,使用了 ClickHandler
委托类型。在 Program
类中,我们订阅了这个事件,并提供了一个事件处理器 Button_Clicked
。
委托是 C# 中一个非常有用的功能,它允许我们将方法作为参数传递,创建多播委托,并用于事件处理。通过使用匿名方法和 Lambda 表达式,我们可以以更简洁的方式使用委托。掌握委托对于理解和使用 C# 中的事件和回调机制至关重要。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!