委托(Delegate)概念
- 委托是一种类型,它定义了方法的签名。它允许将方法作为参数传递给其他方法,就像在C和C++ 中使用函数指针一样,但委托是类型安全的。例如:
public delegate int MathOperation(int a, int b);
public static int Add(int a, int b)
{
return a + b;
}
public static int Subtract(int a, int b)
{
return a - b;
}
class Program
{
static void Main()
{
MathOperation addOperation = Add;
MathOperation subtractOperation = Subtract;
int result1 = addOperation(5, 3);
int result2 = subtractOperation(5, 3);
}
}
事件(Event)概念
- 事件是一种特殊的委托实例,它允许对象向其他对象通知发生了某些事情。事件本质上是在委托的基础上构建的。当某个事件发生时,注册到该事件的方法(事件处理程序)会被自动调用。例如:
public class Button
{
public event EventHandler Click;
public void OnClick()
{
Click?.Invoke(this, EventArgs.Empty);
}
}
class Program
{
static void Button_Click(object sender, EventArgs e)
{
Console.WriteLine("Button was clicked!");
}
static void Main()
{
Button myButton = new Button();
myButton.Click += Button_Click;
myButton.OnClick();
}
}
联系
- 事件基于委托实现。事件本质上是一种特殊的委托实例,它封装了一个委托对象,并提供了一种安全的方式来注册和调用委托所指向的方法。
区别
- 访问修饰符:委托可以有任何访问修饰符,而事件默认具有
private
访问修饰符,并且通常只能在声明它们的类内部引发。
- 赋值方式:委托可以直接赋值新的方法引用,可能会覆盖之前的引用。而事件只能使用
+=
和-=
运算符来添加或移除事件处理程序,不能直接赋值。
- 用途:委托更侧重于将方法作为参数传递,用于实现回调等功能。事件主要用于对象间的通知机制,当特定事件发生时通知其他对象。
事件在实际项目中的使用场景
- 用户界面交互:如按钮点击、菜单选择等。在Windows Forms或WPF应用程序中,用户点击按钮会触发
Click
事件,开发人员可以在事件处理程序中编写响应逻辑,比如保存数据、打开新窗口等。
- 文件系统监控:当文件被创建、修改或删除时,
FileSystemWatcher
类会触发相应的事件,应用程序可以对这些事件做出响应,例如备份文件、更新索引等。
- 网络通信:在Socket编程中,当有新的连接进来、数据接收或发送完成时,相关的事件会被触发,以便应用程序进行相应处理,如处理新连接、解析接收到的数据等。
- 数据绑定:在数据绑定场景中,当数据源中的数据发生变化时,会触发相应的事件通知绑定的控件进行更新,保持界面与数据的一致性。