C# 中的委托和事件(详解)
时间: 2024-02-15 12:06:04 浏览: 44
委托和事件是 C# 中非常重要的概念,它们可以用于实现事件驱动型编程模型。在 C# 中,委托可以被看作是函数指针,它允许将方法作为参数传递到其他方法中,并且可以在其他方法中调用传递进来的方法。而事件则是一种特殊的委托,它用于在类的内部触发和处理特定的动作或状态变化。
一、委托
1.定义
在 C# 中,委托是一种类型,它可以用于存储对方法的引用。委托类型定义的语法如下:
```
delegate returnType methodName(params)
```
其中,returnType 表示方法的返回类型,而 methodName 和 params 分别表示方法的名称和参数列表。
例如,我们可以定义一个委托类型,用于存储一个接受 int 类型参数并返回 string 类型的方法引用:
```
delegate string MyDelegate(int x);
```
2.使用
定义委托类型之后,我们可以创建委托实例,并将方法作为参数传递给委托实例。例如,假设我们有一个方法:
```
static string MyMethod(int x)
{
return "Hello, " + x;
}
```
我们可以创建一个 MyDelegate 委托实例,并将 MyMethod 方法作为参数传递给它:
```
MyDelegate del = new MyDelegate(MyMethod);
```
此时,我们可以通过调用委托实例来调用 MyMethod 方法:
```
string result = del(123);
```
这将会返回字符串 "Hello, 123"。
3.多播委托
在 C# 中,委托还支持多播(multicast)功能,即一个委托实例可以引用多个方法,这些方法将会依次被调用。例如,我们可以定义两个方法:
```
static string Method1(int x)
{
return "Method1: " + x;
}
static string Method2(int x)
{
return "Method2: " + x;
}
```
并将它们作为参数传递给一个委托实例:
```
MyDelegate del = new MyDelegate(Method1);
del += new MyDelegate(Method2);
```
此时,调用委托实例将会依次调用 Method1 和 Method2 方法,并返回它们的结果。
二、事件
1.定义
在 C# 中,事件是一种特殊的委托,它用于在类的内部触发和处理特定的动作或状态变化。事件的定义语法如下:
```
public event EventHandler EventName;
```
其中,EventHandler 是一个预定义的委托类型,它的定义如下:
```
public delegate void EventHandler(object sender, EventArgs e);
```
EventHandler 委托类型包含两个参数:一个 object 类型的 sender,表示事件的发送者;一个 EventArgs 类型的 e,表示事件的参数。
例如,我们可以定义一个事件,用于在类的内部触发和处理某个动作:
```
public event EventHandler MyEvent;
```
2.使用
在类的内部,我们可以通过调用事件来触发特定的动作或状态变化。例如,我们可以定义一个方法,用于触发 MyEvent 事件:
```
protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e);
}
```
在该方法中,我们调用了 MyEvent 委托实例,并传递了当前对象和事件参数。MyEvent?.Invoke() 表示只有在 MyEvent 委托实例不为 null 时才会调用它,这可以避免空引用异常。
在类的外部,我们可以注册事件处理程序来处理 MyEvent 事件。例如,假设我们有一个类:
```
class MyClass
{
public event EventHandler MyEvent;
public void DoSomething()
{
// 触发 MyEvent 事件
OnMyEvent(EventArgs.Empty);
}
protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e);
}
}
```
我们可以在另一个类中注册 MyEvent 事件处理程序:
```
class OtherClass
{
public void HandleMyEvent(object sender, EventArgs e)
{
Console.WriteLine("MyEvent has been handled.");
}
}
OtherClass other = new OtherClass();
MyClass myClass = new MyClass();
myClass.MyEvent += new EventHandler(other.HandleMyEvent);
```
此时,当调用 myClass.DoSomething() 方法时,会触发 MyEvent 事件,并调用 other.HandleMyEvent() 方法来处理它。