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

时间:2012-02-13 10:30:58

标签: c# .net .net-4.0 .net-3.5 delegates

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

//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
  }  
}

3 个答案:

答案 0 :(得分:10)

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

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

myClass.OnAdd = Add;

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

myClass.OnAdd("foo");

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

有关活动和代表的更多信息,请参阅my article on the topic

答案 1 :(得分:2)

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

答案 2 :(得分:0)

一个事件就像一个委托的包装器,提供保护,以防止重新分配/删除,正如约翰所指出的那样。我发现this非常好读。