分配Action <T>方法和订阅Action <T>事件之间的区别

Jon*_*Jon 5 .net c# delegates .net-4.0 .net-3.5

可以说我有以下代码.直接分配动作和订阅事件有什么区别?

//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
  }  
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

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

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

myClass.OnAdd = Add;
Run Code Online (Sandbox Code Playgroud)

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

myClass.OnAdd("foo");
Run Code Online (Sandbox Code Playgroud)

这两者都违反了正常的发布/订阅模式,其中各个订阅者彼此隔离.订阅者不会覆盖彼此的订阅(只添加或删除他们自己的订阅),他们不会自己提出事件.

有关事件和代理的更多信息,请参阅有关该主题的文章.