我正在使用C#3.0。遵循這一標準的事件模式,我有:我的班級是否應該訂閱自己的公共活動?
public event EventHandler<EventArgs> SomeEventHappens;
protected virtual void OnSomeEventHappens(EventArgs e)
{
if (SomeEventHappens != null)
{
SomeEventHappens(this, e);
}
}
private object _someProperty;
public object SomeProperty
{
get
{
return _someProperty;
}
private set
{
if (_someProperty == value)
{
return;
}
OnSomeEventHappens(EventArgs.Empty);
_someProperty = value;
}
}
在我的同班我想的時候採取一些行動SomeProperty
變化。我看到它的方式,我有3個替代品:
1)做我的SomeProperty
二傳手。有些事情是因爲我試圖訂閱每件事物的哲學應該做一件事而做得很好,所以我錯了。把東西塞進一個二傳手似乎是違背了這一點,或者至少有傾向於。
2)在OnSomeEventHappens
做東西。再次,似乎有點反對保持這個簡單的作品。此外,如果此方法被覆蓋,如果實現者不調用基方法,可能會失去功能。
3)是否訂購了SomeEventHappens
。對我來說,就封裝而言,這似乎是一個合適的選擇,而且看起來很乾淨。再次,如果OnSomeEventHappens
被覆蓋,可能會產生影響。
也許有更優雅的東西?我無法在方案2和方案3之間做出決定,而且我很好奇最佳實踐是什麼。畢竟,最安全的地方也許就是財產創造者。
想法?
更新: 感謝您的好評和下面的答案。我已經瞭解到,讓班級訂閱自己的活動是「可以的」,儘管在我的情況下,我傾向於因爲開銷而不願意這樣做。我已經考慮到了我的虛擬方法的潛在覆蓋者的行爲,以及我想要發生的事情。
在我的現實世界中,我並不想在未設置屬性的情況下引發事件。由於下面的答案指導了我的思考過程,所以我認爲我可以選擇1,因爲開銷較低,從繼承者那裏行爲不當的風險降低,並且通常對我來說更合適。再次感謝!
我選擇了這個答案,因爲它是我最終做的最接近的解釋。我從其他答案中學到了很多東西。謝謝! – 2010-08-18 12:01:29