簡體   English   中英

分配動作之間的區別 <T> 方法和訂閱Action <T> 事件

[英]Difference between assigning an Action<T> method and subscribing to Action<T> event

可以說我有以下代碼。 直接分配動作和訂閱事件有什么區別?

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

(順便說一下,當你兩次使用相同的類型名稱時很難解釋。)

當您使用公共字段時,客戶端不僅可以訂閱事件 - 它們還可以通過分配而不是添加以下內容來完全刪除其他事件處理程序:

myClass.OnAdd = Add;

他們也可以直接調用處理程序:

myClass.OnAdd("foo");

這兩者都違反了正常的發布/訂閱模式,其中各個訂閱者彼此隔離。 訂閱者不會覆蓋彼此的訂閱(只添加或刪除他們自己的訂閱),他們不會自己提出事件。

有關事件和代理的更多信息,請參閱我關於該主題的文章

您可以為一個事件分配多個代理(因此+=運算符)。

正如約翰所指出的那樣,一個事件就像一個代表周圍的包裝器,以提供保護,使其不被重新分配/刪除。 我發現這個讀起來非常好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM