1. 委托(Delegates)的基本概念
1.1 什么是委托?
委托是一种类型,用于存储对一个或多个方法的引用。它提供了一种灵活的方式来传递方法,并实现回调机制。
1.2 如何声明和实例化委托?
在C#中,我们可以使用delegate
关键字来声明委托。例如:
delegate void MyDelegate(string message);
// 实例化委托
MyDelegate myDelegate = new MyDelegate(MyMethod);
1.3 使用委托实现回调
通过委托,我们可以实现回调机制,允许将一个方法作为参数传递给另一个方法,使得方法的调用更加灵活。
public void PerformAction(MyDelegate action, string message)
{
action(message);
}
// 调用 PerformAction 方法
PerformAction(myDelegate, "Hello, delegates!");
1.4 委托的多播(Multicast)
委托支持多播,即可以将多个方法绑定到同一个委托实例上,然后一次调用委托会触发所有绑定的方法。
myDelegate += AnotherMethod;
myDelegate("Multiple methods!"); // 会触发 MyMethod 和 AnotherMethod
2. 事件(Events)的基础
2.1 什么是事件?
事件是委托的一种应用,用于实现发布-订阅模式。它允许一个对象在特定条件下通知其他对象。
2.2 如何声明、触发和订阅事件?
在类中声明事件的语法如下:
public class MyEventClass
{
// 事件声明
public event MyDelegate MyEvent;
// 触发事件
public void RaiseEvent(string message)
{
MyEvent?.Invoke(message);
}
}
// 订阅事件
MyEventClass myEventObj = new MyEventClass();
myEventObj.MyEvent += MyEventHandlerMethod;
2.3 事件的优势和在实际项目中的应用
- 降低组件之间的耦合度
- 适用于用户界面、异步编程等场景
3. 实例演示
3.1 使用委托实现简单的事件处理
public class EventDemo
{
public delegate void EventHandler(string message);
public event EventHandler MyEvent;
public void RaiseEvent(string message)
{
MyEvent?.Invoke(message);
}
}
// 使用
EventDemo eventDemo = new EventDemo();
eventDemo.MyEvent += MyEventHandlerMethod;
eventDemo.RaiseEvent("Event demo!");
3.2 利用事件实现松耦合的组件通信
public class Button
{
public event Action Click;
public void OnClick()
{
Click?.Invoke();
}
}
// 使用
Button myButton = new Button();
myButton.Click += () => Console.WriteLine("Button clicked!");
myButton.OnClick();
3.3 多播委托和事件的应用场景
public class EventMulticast
{
public delegate void MyDelegate(string message);
public event MyDelegate MyEvent;
public void RaiseEvent(string message)
{
MyEvent?.Invoke(message);
}
}
// 使用
EventMulticast multicast = new EventMulticast();
multicast.MyEvent += MyEventHandlerMethod1;
multicast.MyEvent += MyEventHandlerMethod2;
multicast.RaiseEvent("Multicast event!");
4. 最佳实践和注意事项
- 委托和事件应用于需要解耦和扩展的场景。
- 注意事件的订阅和取消订阅,防止内存泄漏。