委托和事件介绍

来源:microsoft learn

委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。 你可以通过委托实例调用方法。

和委托类似,事件是后期绑定机制。 实际上,事件是建立在对委托的语言支持之上的。

事件是对象用于(向系统中的所有相关组件)广播已发生事情的一种方式。 任何其他组件都可以订阅事件,并在事件引发时得到通知。

委托的使用

public delegate void MyDelegate(string name);

声明了一个带有单一的 string 参数的委托,定义委托的方法是加上delegate修饰。接下来将委托进行实例化,首先创建两个方法。

private static void EnglishMyname(string name)
{
    Console.WriteLine("Myname is  " + name);
}
private static void ChineseMyname(string name)
{
    Console.WriteLine("我的名字是 " + name);
}

创建委托实例。

MyDelegate a = new MyDelegate(EnglishMyname);
MyDelegate b = new MyDelegate(ChineseMyname);

使用委托对象调用方法

a("LiHua");
b("李华");

委托可以进行多播,+=。

事件的使用

首先声明该事件的委托类型。

public delegate void MyDelegate(string str);

实例化后的委托对象叫做事件,声明事件本身,使用 event 关键字。

public event MyDelegate MyEvent;

通过事件使用委托

首先定义一个事件相应类和事件处理器,可以理解为回调方法。

/// <summary>
/// 事件响应类
/// </summary>
public class EventResponse{
    //事件处理器
    private void OnTest()
    {
     Console.WriteLine("被调用一次");
     }
  }

其次声明一个事件本身。声明事件有两种方式:

  • 完整的声明:

    • 先声明委托
    • 再声明事件
  • 简单声明:

    • 自动生成了委托字段,事件是委托字段的包装器

简单声明如下:

public delegate void MyDelegate();
public class EventTest
{
   public event MyDelegate MyEnvent;
}

使用 += 运算符订阅事件,使用 -= 运算符取消订阅,处理程序方法通常为前缀“On”,后跟事件名称。

EventTest.MyEvent += EventResponse.OnTest

最后触发事件。

EventTest.MyEvent?.Invoke();