二、C#基础语法( 委托与事件)

委托(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 事件。

需要注意的是,事件只能由定义它的类或内部类访问。外部类无法直接访问事件,只能通过订阅和触发事件来与内部类进行通信。