在對象的構造函數Listener
中,我們接受一個參數並訂閱其中一個事件。如果事件訂閱後在構造函數中引發異常,則在引發事件時仍會調用OnSomethingChanged()
方法 - 即使通過該對象未成功構建,並且據我所知,也不存在實例。即使對象構建失敗也會調用本地事件偵聽器
現在我可以通過明顯重新設計這個設計來解決這個問題,但是我更感興趣的是爲什麼實例方法被調用,即使構造函數沒有成功完成?如果該方法使用任何在異常之前未初始化的局部變量,那麼顯然它會進入BOOM!
class Program
{
static void Main(string[] args)
{
Input input = new Input();
try
{
new Listener(input);
}
catch (InvalidOperationException)
{
// swallow
}
input.ChangeSomething(); // prints "Something changed!"
}
}
public class Listener
{
public Listener(Input input)
{
input.SomethingChanged += OnSomethingChanged; // subscibe
throw new InvalidOperationException(); // do not let constructor succeed
}
void OnSomethingChanged(object sender, EventArgs e)
{
Console.WriteLine("Something changed!");
}
}
public class Input
{
public event EventHandler SomethingChanged;
public void ChangeSomething()
{
SomethingChanged(this, EventArgs.Empty);
}
}
這確實非常有趣,而不是我所期望的。我也發現[這篇文章](http://stackoverflow.com/questions/5697446/is-an-object-constructed-if-an-initializer-throws)是相當豐富的。感謝您的回覆 –
不客氣。這篇文章完全涉及了另一個問題,但也有類似的前提。 – BoltClock