2013-09-26 10 views
2

請考慮以下示例。事件如何比代表更有力

Stock類火災的PriceChanged事件每 時間的股票的價格變化:

public delegate void PriceChangedHandler (decimal oldPrice,decimal newPrice); 
public class Stock 
{ 
    string symbol; 
    decimal price; 
    public Stock (string symbol) { this.symbol = symbol; } 
    public event PriceChangedHandler PriceChanged; 
    public decimal Price 
    { 
     get { return price; } 
     set 
     { 
      if (price == value) return; // Exit if nothing has changed 
      if (PriceChanged != null) // If invocation list not empty, 
      PriceChanged (price, value); // fire event. 
      price = value; 
     } 
    } 
} 

如果我們要從我們的例子中,事件的關鍵字,這樣PriceChanged成爲 普通的委託場,我們的例子會給出相同的結果。然而,Stock 將不太健壯,

我的問題是什麼方式的事件關鍵字使股票更健壯?

回答

4

我的問題是事件關鍵字以何種方式使股票更健壯?

這些都是外部客戶可以做的事。只有

  • 呼叫所有現有的處理程序本身
  • 刪除/替換所有現有的處理程序

相反,通過使用事件,其他代碼可以:如果這只是一個公共領域,那麼任何人都可以訂閱活動或取消訂閱。我不會用「強大」這個詞來描述這種差異 - 這是一個封裝問題,並且表示其他代碼應該能夠用Stock的實例來做什麼。

有關更多信息,請參閱我的article on delegates and events

+0

+1 Oh jon,你在這裏:)我只是在搜索你的文章鏈接.. –

+0

此外,它改變了一對多/一對一的含義。如果它的唯一代表,它一次只能設置一個功能,而事件可以「激發」很多功能 – ilansch

+0

@ilansch:不,那是不正確的。代表是多播的。所以你可以使用'stock.PriceChanged = firstHandler + secondHandler;' –