2010-09-28 82 views
2

有人能解釋一下下面的代碼部分的含義:事件委託(在)平等?

private event UserChangedHandler m_UserChanged; 
public event UserChangedHandler UserChanged 
{ 
    add 
    { 
     if (m_UserChanged != value) 
     { 
     m_UserChanged += value; 
     } 
    } 
} 

感謝

回答

4

add { }是一個結構很像get { }的性能,除了在添加事件的作品。將代表添加到事件時,您正在定義自定義功能。

在這種情況下,這種方法可以防止身體連續重複(即不能在一行中兩次寄存器相同的方法/處理程序)。

所以在這個例子:

public void HandlerUserChanged(object o, UserChangedEventArgs args) 
{ 
    // some code 
} 

public void HandlerUserChanged2(object o, UserChangedEventArgs args) 
{ 
    // some code 
} 

後來:

UserChanged += HandleUserChanged; 
UserChanged += HandleUserChanged; 
UserChanged(this, new UserChangedEventArgs()); 

方法HandleUserChanged只會觸發一次,即使你註冊了兩次。正常事件(沒有add { })會調用該函數兩次。

但是:

UserChanged += HandleUserChanged; 
UserChanged += HandleUserChanged2; 
UserChanged += HandleUserChanged; 
UserChanged(this, new UserChangedEventArgs()); 

將允許HandleUserChanged射擊兩次,因爲最後註冊的處理程序是不是曾經被添加的一個。事件上的==運算符在LAST處理函數上工作。 (三江源馬修爲使這一立正)

+1

雖然上面的代碼不會阻止您添加兩次相同的方法。如果將方法A和方法B添加到UserChanged事件中,則仍可以再次添加方法A. – 2010-09-28 15:58:28

+0

@Matthew Manela:你說得對,它只會阻止連續添加。謝謝你指出這一點。 – Aren 2010-09-28 16:00:33

0

這令我奇怪的是,m_UserChanged被聲明爲一個事件,而不僅僅是一個委託實例(是正確的術語...我弄糊塗W /代表) 。事件類似於簡單的Property模型,因爲它們實質上是在一對透明方法中包裝基礎字段。

我的理解是,淨允許創建implcit的(匿名?)事件和性質,採取這樣的事情:

public int Value { get; set;} 
public event EventHandler ValueChanged; 

,然後建立相應的基礎佔位符對象來產生更多的東西像這樣:

private int _Value; 
public int Value { get { return _Value;} set { _Value = value;}} 

private EventHandler _ValueChanged; 
public event EventHandler ValueChange { add { _ValueChanged += value;} remove { _ValueChanged -= value;}} 

根本目的可以被明確定義的過程,但什麼上面的代碼示例看起來有點顯性和隱性的事件聲明之間的糅合在一起的......它看起來像下面是實際LY正在做(在幕後,因爲它是):

private UserChangedHandler _m_UserChanged; 
private event UserChangedHandler m_UserChanged { add { _m_UserChanged += value;} remove { _m_UserChanged -= value;}} 
public event UserChangedHandler UserChanged 
{ 
    add 
    { 
     if (m_UserChanged != value) 
     { 
     m_UserChanged += value; 
     } 
    } 
} 

這並不在事物的宏偉計劃沒關係,我不用猜,但它看起來像一個監督。