2011-12-09 90 views
5

我一直在玩代表,活動和匿名方法。這樣做有一點變得非常清楚。在構造函數中註冊事件?

它不簡化在構造函數中註冊任何事件方法或委託函數的過程嗎?

我的測試顯示它的工作原理,它可以防止你必須在實例化後聲明它們(因爲對象的構造函數爲你做)。

其實這個表現還是不錯的。在構造/實例化對象時使用「this」關鍵字引用當前對象有什麼缺點嗎?

這似乎對我很有意義,因爲所有的事件都會在實例化時被連接起來。

這有可能是一個問題嗎?

例子:

//Constructor 
public SayHello() 
{ 
    _name = "Unnamed"; 
    _isUpdated = false; 

    // Register event handler via lambda (ananymous method shorthand) 
    this.NameChanged += (object sender, EventArgs e) => { Console.WriteLine(e.message)); }; 
} 

回答

12

這種方法存在一些潛在的問題。首先,從更廣泛的角度來看,出於性能原因,通常應該使用方法覆蓋來訂閱自發布事件。很明顯,如果事件被暴露於沒有相應的可重寫方法的事件的基於外部的基類暴露,這是不可能的。但是,訂閱自發布事件應該是最後的方法,而不是默認方法。

第二個潛在的問題更嚴重,但它與事件觸發的代碼的作用有關,而不是哪個對象公開事件。例如,考慮下面的構造:

public Foo(Bar bar) 
{ 
    bar.SomeEvent += (s, e) => this.DoSomething(); 
} 

如果酒吧火災在另一個線程SomeEvent,你的Foo實例的DoSomething的方法可以被稱爲實例已完全初始化之前。在Java空間中這是一個相當有據可查的問題(例如,請參閱http://www.ibm.com/developerworks/java/library/j-jtp0618/index.html),但C#/ .NET的覆蓋範圍更加稀疏。 http://www.bluebytesoftware.com/blog/2010/06/27/OnPartiallyconstructedObjects.aspx提供了一些詳細的.NET覆蓋,但它可能比你想知道的要多...

+0

妮可,優秀點。這正是我所期待的。我的直覺告訴我,增加的簡化可能是有問題的(因此後)。在測試中,事情可能很好,但在生產中,墨菲的定律將會生效......概率上,任何可能發生的事情都會給予足夠的時間。鑑於此,如果所述應用程序是多線程的(如服務或Web門戶),則會在某個時間點發生競爭爭用。謝謝。 – Qubits

1

我不認爲有任何問題。這取決於你如何做到這一點。您可以在其構造函數中使用該對象本身。如果你忽略了this,它也可以工作。

+0

這就是我的想法。我發現它非常「不」必須在客戶端聲明事件(假設對象可以實例化所有代碼)。這就是說,只是在尋找任何潛在的陷阱來考慮。到目前爲止,我還沒有遇到任何其他內存使用情況(只有在事件不相關的情況下才需要關注)。 – Qubits