2011-02-10 43 views
11

通常我們使用此代碼:編寫事件的簡短方法?

private EventHandler _updateErrorIcons; 
    public event EventHandler UpdateErrorIcons 
    { 
     add { _updateErrorIcons += value; } 
     remove { _updateErrorIcons -= value; } 
    } 

是否有類似的快捷鍵像自動屬性? 類似於:

public event EventHandler UpdateErrorIcons { add; remove; } 
+0

這真的很有趣,大多數人甚至從來沒有聽說過擴展代碼:) – Andrey 2011-02-10 16:29:11

+0

是的,即使我已經看到人們這樣做,我從來沒有親自使用過它,編譯器稍後會添加它。 – 2011-02-10 16:30:52

回答

14

是的。擺脫{ add; remove; }部分和背委託外地的,你是金:

public event EventHandler UpdateErrorIcons; 

這就是它!

讓我在你問這個問題之前補充一點,我甚至沒有想過自動實現的事件版本與屬性不一致的事實。就個人而言,我實際上寧願它,如果自動實施的事件工作的方式,你第一次嘗試在你的問題。這將更加一致,並且它也可以作爲心理提示,事件不是而是與委託字段相同,就像屬性與常規字段不相同。

老實說,我認爲你是罕見的例外,你真的知道自定義語法第一個。很多.NET開發人員都不知道可以選擇實現自己的addremove方法。


更新:就你自己心安,我使用Reflector已確認事件的C#4的默認實現(即,當你去自動實現的途徑獲取生成的實現)是相同的:

private EventHandler _updateErrorIcons; 
public event EventHandler UpdateErrorIcons 
{ 
    add 
    { 
     EventHandler current, original; 
     do 
     { 
      original = _updateErrorIcons; 
      EventHandler updated = (EventHandler)Delegate.Combine(original, value); 
      current = Interlocked.CompareExchange(ref _updateErrorIcons, updated, original); 
     } 
     while (current != original); 
    } 
    remove 
    { 
     // Same deal, only with Delegate.Remove instead of Delegate.Combine. 
    } 
} 

注意上面使用無鎖同步有效序列addremove電話。所以如果你使用的是最新的C#編譯器,你不需要自己實現add/remove進行同步,你自己甚至

+3

和後臺領域。 (事實上​​,在OP中,你會發現很多人甚至都不知道「add」和「remove」事件訪問器)。 – 2011-02-10 16:27:28

4
public event EventHandler UpdateErrorIcons; 

就好了

可以使用

yourObbject.UpdateErrorIcons += YourFunction; 
2

add {}remove {}僅用於在您需要手動處理事件進行連接的特殊情況。我們凡人通常只使用public event EventHandler UpdateErrorIcons;,其中「EventHandler」是首選代表。

例如:

public delegate void MyEventDelegate(object sender, string param1); 
public event MyEventDelegate MyEvent;

注意,因爲MyEvent爲空,如果沒有,你需要檢查它是否調用前空任何偵聽器。這樣做檢查的標準方法是:

public void InvokeMyEvent(string param1) 
{ 
    MyEventDelegate myEventDelegate = MyEvent; 
    if (myEventDelegate != null) 
     myEventDelegate(this, param1); 
} 

在此檢查的一個關鍵因素是使有問題的對象的副本,然後再只在副本上工作。如果不是,你可能會遇到罕見的競爭條件,其中另一個線程在你的電話和你的電話之間解除聯繫。

相關問題