是的。擺脫{ add; remove; }
部分和背委託外地的,你是金:
public event EventHandler UpdateErrorIcons;
這就是它!
讓我在你問這個問題之前補充一點,我甚至沒有想過自動實現的事件版本與屬性不一致的事實。就個人而言,我實際上寧願它,如果自動實施的事件工作的方式,你第一次嘗試在你的問題。這將更加一致,並且它也可以作爲心理提示,事件不是而是與委託字段相同,就像屬性與常規字段不相同。
老實說,我認爲你是罕見的例外,你真的知道自定義語法第一個。很多.NET開發人員都不知道可以選擇實現自己的add
和remove
方法。
更新:就你自己心安,我使用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.
}
}
注意上面使用無鎖同步有效序列add
和remove
電話。所以如果你使用的是最新的C#編譯器,你不需要自己實現add
/remove
進行同步,你自己甚至。
這真的很有趣,大多數人甚至從來沒有聽說過擴展代碼:) – Andrey 2011-02-10 16:29:11
是的,即使我已經看到人們這樣做,我從來沒有親自使用過它,編譯器稍後會添加它。 – 2011-02-10 16:30:52