在C#中,委托(Delegates)和事件(Events)是用于实现事件驱动编程的关键组件。
委托(Delegates)
委托是一种特殊的类型,它定义了方法的签名(即方法的返回类型和参数类型),并可以持有对具有相同签名的方法的引用。通过委托,你可以将方法当作参数传递、存储在变量中或者作为其他方法的返回值。这使得编程更加灵活,尤其是在设计回调方法或者异步处理时。
委托的声明和使用
csharp
// 声明一个委托,它可以引用任何返回void且接受两个int参数的方法。
public delegate void MyDelegate(int a, int b);
public class Program
{
// 一个符合委托签名的方法
public static void Add(int x, int y)
{
Console.WriteLine($"{x} + {y} = {x + y}");
}
// 另一个符合委托签名的方法
public static void Subtract(int x, int y)
{
Console.WriteLine($"{x} - {y} = {x - y}");
}
public static void Main()
{
// 创建委托实例并关联到Add方法
MyDelegate del = new MyDelegate(Add);
// 通过委托调用方法
del(10, 20); // 输出: 10 + 20 = 30
// 将委托关联到Subtract方法
del = Subtract;
// 再次通过委托调用方法
del(10, 5); // 输出: 10 - 5 = 5
}
}
事件(Events)
事件是一种使类或对象可以通知其他类或对象发生了某些事情的机制。在定义事件的类中,它通常是基于某个委托类型的字段,不过它使用了特殊的事件语法和两个附加的访问器 add
和 remove
来管理委托的订阅者列表。
事件的声明和使用
csharp
// 声明一个委托
public delegate void MyEventHandler(string message);
public class Publisher
{
// 声明一个事件,基于上面的委托
public event MyEventHandler SomethingHappened;
// 触发事件的方法
public void DoSomething(string message)
{
// 触发事件
SomethingHappened?.Invoke(message);
}
}
public class Subscriber
{
// 事件处理器
public void OnSomethingHappened(string message)
{
Console.WriteLine($"Received message: {message}");
}
}
public class Program
{
public static void Main()
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
// 订阅事件
publisher.SomethingHappened += subscriber.OnSomethingHappened;
// 触发事件
publisher.DoSomething("Hello, World!"); // 输出: Received message: Hello, World!
// 取消订阅事件
publisher.SomethingHappened -= subscriber.OnSomethingHappened;
// 再次触发事件,由于没有订阅者,所以没有输出
publisher.DoSomething("Hello again!");
}
}
在上面的例子中,Publisher
类有一个名为 SomethingHappened
的事件,和一个触发该事件的方法 DoSomething
。Subscriber
类有一个方法 OnSomethingHappened
,它将被用作事件的处理器。在 Main
方法中,创建了 Publisher
和 Subscriber
的实例,并将 subscriber.OnSomethingHappened
方法订阅到 publisher.SomethingHappened
事件。当 DoSomething
被调用时,它将触发事件,从而导致 OnSomethingHappened
方法被调用。如果取消订阅,那么 DoSomething
的调用将不会有任何效果,因为没有事件处理器与之关联。