委托(Delegate)
委托是一种类型安全的函数指针,它可以引用具有相同签名的方法。委托可以看作是方法的类型,它定义了一种类型,该类型的对象可以引用任何具有相同签名的方法。
委托的声明使用 delegate 关键字,后跟委托的返回类型和参数列表。例如:
public delegate int MyDelegate(int x, int y);
这个声明定义了一个名为 MyDelegate 的委托,它可以引用一个返回类型为 int 并且接受两个 int 参数的方法。
要使用委托,需要先定义一个方法,然后将其分配给委托变量。例如:
public int Add(int x, int y)
{
return x + y;
}
MyDelegate del = new MyDelegate(Add);
这里将 Add 方法分配给了 MyDelegate 类型的委托变量 del。现在,del 可以被用来调用 Add 方法:
int result = del(1, 2); // result 的值为 3
事件(Event)
事件是委托的特殊类型,它允许外部类向内部类发送消息。事件使用 event 关键字声明,可以看作是委托的成员变量。事件可以被订阅和取消订阅,当事件被触发时,所有订阅了该事件的委托都会被调用。
以下是声明和使用事件的示例:
public class MyClass
{
// 声明一个事件
public event EventHandler MyEvent;
// 触发事件的方法
protected virtual void OnMyEvent()
{
MyEvent?.Invoke(this, EventArgs.Empty); // 如果有订阅者则触发事件,否则不执行任何操作
}
}
在其他类中订阅和触发事件:
MyClass obj = new MyClass();
obj.MyEvent += (sender, e) => { Console.WriteLine("事件被触发了!"); }; // 订阅事件
obj.OnMyEvent(); // 触发事件,控制台输出 "事件被触发了!"
```在上面的示例中,MyClass 类声明了一个名为 MyEvent 的事件,该事件类型为 EventHandler。在 OnMyEvent 方法中,通过 MyEvent?.Invoke 语句来触发事件。如果有订阅了 MyEvent 的委托,则该委托会被调用;如果没有订阅者,则不执行任何操作。
在其他类中,通过 obj.MyEvent += ... 语句来订阅事件。当调用 obj.OnMyEvent() 方法时,控制台输出 "事件被触发了!",因为我们已经订阅了 MyEvent 事件。
需要注意的是,事件只能由定义它的类或内部类访问。外部类无法直接访问事件,只能通过订阅和触发事件来与内部类进行通信。