在对象的构造函数
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);
}
}