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. 我们定义了一个与方法SayHello,它匹配我们的SimpleDelegate签名。
  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($"温度变为 {newTemperature}°C");
}
}

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

委托方法

以下是一些常见的与委托相关的方法:

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

结论

恭喜你!你刚刚迈出了进入C#委托世界的第一步。我们介绍了如何声明委托、实例化它们、多重广播,甚至看到了一个与事件处理相关的实际例子。

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

随着你在C#旅程的继续,你将发现委托越来越多的用途。它们就像你编程工具箱中的瑞士军刀——多功能且在需要时总是很方便。

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

Credits: Image by storyset