C# - 委派:初学者的友好指南

你好啊,未来的编程巨星!今天,我们将要深入探索 C# 委派的迷人世界。如果你之前从未听说过它们,不用担心——在本教程结束时,你将成为委派高手!让我们一起踏上这段激动人心的旅程。

C# - Delegates

委派是什么?

想象你在组织一个派对,需要有人来负责音乐。你自己不做,而是将这个任务委派给你的DJ朋友。在 C# 中,委派的工作方式与此类似——它们就像是我们用来持有和调用方法的小使者。

用更简单的术语来说,委派是一种类型,它代表了对具有特定参数列表和返回类型的方法的引用。你可以将其视为一个方法的蓝图。

声明委派

让我们先学习如何声明一个委派。语法非常简单:

public delegate void SimpleDelegate();

这声明了一个名为 SimpleDelegate 的委派,它可以引用不接收参数且不返回任何内容(void)的方法。

下面是另一个例子:

public delegate int MathDelegate(int x, int y);

这个 MathDelegate 可以引用任何接收两个整数并返回一个整数的方法。

实例化委派

现在我们已经声明了委派,来看看如何使用它们。我们将从一个与方法签名匹配的方法开始:

public static void SayHello()
{
Console.WriteLine("Hello, Delegates!");
}

// 实例化委派
SimpleDelegate greet = new SimpleDelegate(SayHello);

// 调用委派
greet();

运行此代码将输出:"Hello, Delegates!"

让我们分解一下:

  1. 我们定义了一个匹配 SimpleDelegate 签名的方法 SayHello
  2. 我们创建了一个 SimpleDelegate 的实例并将其赋值为 SayHello 方法。
  3. 我们使用 greet() 调用了委派,这反过来又调用了 SayHello

委派的广播

现在,让我们看看委派真正酷炫的地方。它们可以持有多个方法的引用!这被称为广播。让我们看看它是如何工作的:

public static void SayHello() { Console.WriteLine("Hello"); }
public static void SayGoodbye() { Console.WriteLine("Goodbye"); }

SimpleDelegate greetings = SayHello;
greetings += SayGoodbye;

greetings(); // 这将调用 SayHello 和 SayGoodbye

输出:

Hello
Goodbye

这难道不酷吗?我们将两个方法添加到了我们的委派中,当我们调用它时,两个方法都会按添加顺序被调用。

使用委派

委派在许多场景中都非常有用。一个常见的用途是在事件处理中。让我们看一个简单的例子:

public delegate void TemperatureChangedHandler(float newTemperature);

class Thermostat
{
private float _temperature;
public event TemperatureChangedHandler TemperatureChanged;

public float Temperature
{
get { return _temperature; }
set
{
if (_temperature != value)
{
_temperature = value;
OnTemperatureChanged();
}
}
}

protected virtual void OnTemperatureChanged()
{
if (TemperatureChanged != null)
{
TemperatureChanged(_temperature);
}
}
}

class Program
{
static void Main()
{
Thermostat thermostat = new Thermostat();
thermostat.TemperatureChanged += HandleTemperatureChange;

thermostat.Temperature = 25.5f;
}

static void HandleTemperatureChange(float newTemperature)
{
Console.WriteLine($"Temperature changed to {newTemperature}°C");
}
}

在这个例子中,我们创建了一个 Thermostat 类,它使用委派来通知温度的变化。Main 方法订阅了这个事件,当温度被设置时,它触发了 HandleTemperatureChange 方法。

委派方法

以下是一些常见的与委派相关的方法表格:

方法 描述
Invoke 调用委派持有的方法
BeginInvoke 开始异步调用委派
EndInvoke 结束异步调用委派
GetInvocationList 返回表示调用列表的委派数组

结论

恭喜你!你已经迈出了进入 C# 委派世界的第一步。我们介绍了声明委派、实例化它们、广播以及一个实际的事件处理示例。

记住,委派一开始可能看起来有点抽象,但它们是 C# 中非常强大的工具。它们允许灵活和松散耦合的设计,特别是在事件驱动编程中。

在你继续你的 C# 之旅时,你会找到越来越多的委派用途。它们就像你编程工具包中的瑞士军刀——多功能且在需要时总是很方便。

继续练习,保持好奇心,在你意识到之前,你将像专业人士一样委派任务给代码!快乐编程!

Credits: Image by storyset