【发布时间】:2011-08-02 13:57:00
【问题描述】:
在对象Listener 的构造函数中,我们接受一个参数并订阅它的一个事件。如果在订阅事件后在构造函数中引发异常,则在引发事件时仍会调用 OnSomethingChanged() 方法 - 即使对象未成功构造,并且据我所知,不存在实例。
现在我可以通过稍微重构设计来解决这个问题,但是我更感兴趣的是为什么即使构造函数没有成功完成也会调用实例方法?如果该方法使用了在异常之前尚未初始化的任何局部变量,那么显然它会爆炸!
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);
}
}
【问题讨论】:
标签: c# .net exception constructor event-handling