分配动作<;T>;方法并订阅Action<;T>;事件

本文关键字:gt lt Action 事件 分配 方法 | 更新日期: 2023-09-27 18:24:23

假设我有下面的代码。直接分配操作和订阅事件有什么区别?

//Action directly assigned
public class ClassA
{
  public Action<string> OnAdd;
  private void SomethingHappened()
  {
     OnAdd("It Happened");
  }
}
public class ClassB
{
  public ClassB()
  {
    var myClass = new ClassA();
    myClass.OnAdd =  Add;
  }
  private void Add(string Input)
  {
    //do something
  }  
}
//Event handlers
public class ClassA
{
  public event Action<string> OnAdd;
  private void SomethingHappened()
  {
    if (OnAdd != null)
     OnAdd("It Happened"); //Should it be OnAdd.Invoke("It Happened") ???????
  }
}
public class ClassB
{
  public ClassB()
  {
    var myClass = new ClassA();
    myClass.OnAdd += Add;
  }
  private void Add(string Input)
  {
    //do something
  }  
}

分配动作<;T>;方法并订阅Action<;T>;事件

(顺便说一句,当你使用了两次相同的类型名称时,很难解释。)

当您使用公共字段时,客户端不仅可以订阅事件,还可以通过分配而不是添加来完全删除其他事件处理程序

myClass.OnAdd = Add;

他们还可以直接调用处理程序:

myClass.OnAdd("foo");

这两者都违反了正常的pub/sub模式,即不同的订阅者彼此隔离。订阅服务器无法覆盖彼此的订阅(只能添加或删除自己的订阅),也无法自行引发事件。

有关活动和代表的更多信息,请参阅我关于该主题的文章。

您可以为一个事件分配多个委托(因此是+=运算符)。

正如John所指出的,事件就像代理的包装器,提供保护以防止重新分配/删除。我觉得这本书读起来很不错。