【问题标题】:Difference between assigning an Action<T> method and subscribing to Action<T> event分配 Action<T> 方法和订阅 Action<T> 事件之间的区别
【发布时间】:2012-03-04 18:16:52
【问题描述】:

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

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

【问题讨论】:

  • 通常您将使用 EventArgs 而不是使用操作来创建事件。
  • @SoMoS 即使它只是一个字符串或整数被传递?
  • @jon 这行myClass.Add = myClass.OnAdd; 无效....Add 指的是什么?
  • @RoyiNamir 谢谢,很好。已修改代码
  • @jon i.stack.imgur.com/LeUSA.jpg请看推荐模式

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


【解决方案1】:

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

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

myClass.OnAdd = Add;

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

myClass.OnAdd("foo");

这两种方式都违反了正常的发布/订阅模式,其中各种订阅者彼此隔离。订阅者不能覆盖彼此的订阅(只能添加或删除自己的订阅),也不能自己引发事件。

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

【讨论】:

  • 从您的书中阅读 - 该事件是委托链的类似属性(getter setter),它就像另一个不允许用户执行“=”的保护级别。(ps您发送的种子我昨天是 50GB !!:) ) 但它值得...:)
  • @RoyiNamir:是的,差不多。它不是获取/设置,而是添加/删除。
  • @JonSkeet 感谢您的回答,使用相同的名称说明了问题的重点——看起来非常相似的两件事之间有什么区别
  • @jon 但是为什么当他写public Action&lt;string&gt; OnAdd; 你告诉他不要写公共字段? .如果他添加 event 字词 - 它仍然是公共字段......那么你在 When you use a public field, clients can not only 中的意思是什么......他只能添加 event 关键字......不是吗?
  • @RoyiNamir 我认为这是针对@JonSkeet?有效的问题。无论写什么都会公开
【解决方案2】:

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

【讨论】:

  • 如果您也只有一个委托字段,您也可以创建复合事件...关键是您拥有的事件只需添加一个处理程序,而不是覆盖现有的那些。
【解决方案3】:

正如 John 所指出的,Event 就像 Delegate 周围的包装器一样提供保护,防止重新分配/删除。我发现this 很好读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    相关资源
    最近更新 更多