8. 委托和事件
8.1 委托 (Delegate)
委托 是一种类型安全的函数指针,它允许将方法作为参数传递给其他方法。委托可以用来定义回调方法。
基本概念
- 声明委托:使用
delegate
关键字声明委托类型。 - 实例化委托:可以将一个或多个方法绑定到委托实例。
- 调用委托:通过委托实例调用绑定的方法。
代码示例
csharp
using System;
// 声明一个委托类型
public delegate void MyDelegate(string message);
public class Program
{
// 定义一个与委托签名匹配的方法
public static void SayHello(string message)
{
Console.WriteLine("Hello, " + message);
}
public static void SayGoodbye(string message)
{
Console.WriteLine("Goodbye, " + message);
}
public static void Main()
{
// 实例化委托并将方法绑定到委托实例
MyDelegate myDelegate = new MyDelegate(SayHello);
myDelegate += SayGoodbye; // 绑定另一个方法
// 调用委托
myDelegate("World");
}
}
输出:
Hello, World
Goodbye, World
8.2 事件 (Event)
事件 是一种特殊的委托,用于实现发布-订阅模式。事件通常用于类与类之间的通信。
基本概念
- 声明事件:使用
event
关键字声明事件。 - 触发事件:使用
event
关键字声明的委托实例来触发事件。 - 订阅事件:使用
+=
运算符订阅事件。 - 取消订阅事件:使用
-=
运算符取消订阅事件。
代码示例
csharp
using System;
// 声明一个委托类型
public delegate void MyEventHandler(string message);
public class Publisher
{
// 声明一个事件
public event MyEventHandler MyEvent;
// 触发事件的方法
public void TriggerEvent(string message)
{
MyEvent?.Invoke(message); // 使用 ?. 避免空引用异常
}
}
public class Subscriber
{
// 定义一个与委托签名匹配的方法
public void OnMyEvent(string message)
{
Console.WriteLine("Subscriber received: " + message);
}
}
public class Program
{
public static void Main()
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
// 订阅事件
publisher.MyEvent += subscriber.OnMyEvent;
// 触发事件
publisher.TriggerEvent("Hello, World!");
// 取消订阅事件
publisher.MyEvent -= subscriber.OnMyEvent;
// 再次触发事件,观察是否收到消息
publisher.TriggerEvent("This will not be received.");
}
}
输出:
Subscriber received: Hello, World!
总结
- 委托 是一种类型安全的函数指针,可以将方法作为参数传递。
- 事件 是一种特殊的委托,用于实现类与类之间的通信,通常用于发布-订阅模式。
- 通过委托和事件,可以实现松耦合的设计,提高代码的可维护性和可扩展性。