A field-like-event
是一種同時聲明委託變量和事件的方法。「場地般的事件」和「一般事件」的澄清?
所以像事件(public event EventHandler MyEvent;
)字段可以轉化爲:(從here拍攝)
private EventHandler _myEvent;
public event EventHandler MyEvent
{
add
{
lock (this)
{
_myEvent += value;
}
}
remove
{
lock (this)
{
_myEvent -= value;
}
}
}
通知私有備份領域。
然而,我被Jon(評論部分)修正,即一般的事件doen't有備份領域。例如:
public event EventHandler MyEvent
{
add
{
Console.WriteLine ("add operation");
}
remove
{
Console.WriteLine ("remove operation");
}
}
注意 - 沒有備份字段。
但隨後他說,WinForm的行爲是這樣的:
例如,在那裏有很多的活動,但只有一個 幾個可能被訂閱,你可以有從地圖的情況下一些關鍵 描述事件給當前處理它的委託。這是 Windows窗體所做的 - 這意味着您可以擁有大量的 事件,而不會浪費大量內存,其中 通常只有空值。
問:
- 如何WinForm的使用地圖事情暴露事件,而
我注意到你在C#1,2和3中顯示了類似於場的事件的代碼。在C#4中我們大大改進了這個代碼。有關詳細信息,請參閱http://blogs.msdn.com/b/cburrows/archive/2010/03/05/events-get-a-little-overhaul-in-c-4-part-i-locks.aspx。 – 2013-05-04 14:26:44
@EricLippert事實上,「_add和remove call將有效地serial_」可以讓我們刪除鎖? (如果我正確地理解了文章...) – 2013-05-04 14:45:23
鎖被替換爲一個無鎖原子測試集,它與鎖具有相同的效果,只要訪問序列化,但沒有鎖定的令人討厭的副作用'this'。鎖定'this'的問題在於*別人可以鎖定*,現在你已經使得事件處理鎖定的正確性和效率與鎖定'this'的其他人的正確性和效率緊密相關。這就是爲什麼鎖定'this'是一種糟糕的編程習慣。 – 2013-05-04 14:59:01