Trong hàm tạo của một đối tượng, Listener
, chúng ta lấy một đối số và đăng ký một trong các sự kiện của nó. Nếu một ngoại lệ được ném vào bên trong hàm tạo sau khi sự kiện được đăng ký, phương thức OnSomethingChanged()
vẫn được gọi khi sự kiện được nâng lên - thậm chí thông qua đối tượng không được xây dựng thành công và theo như tôi biết, không có cá thể nào tồn tại.Trình nghe sự kiện cục bộ được gọi ngay cả khi đối tượng không được xây dựng
Bây giờ tôi có thể khắc phục điều này bằng cách hiển thị lại thiết kế một chút, tuy nhiên tôi quan tâm nhiều hơn lý do tại sao một phương thức thể hiện được gọi mặc dù hàm tạo không hoàn tất thành công? Nếu phương thức này sử dụng bất kỳ biến cục bộ nào chưa được khởi tạo trước khi ngoại lệ thì rõ ràng là nó đi 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);
}
}
Điều đó thực sự cực kỳ thú vị và không phải những gì tôi mong đợi. Tôi cũng đã tìm thấy [bài đăng này] (http://stackoverflow.com/questions/5697446/is-an-object-constructed-if-an-initializer-throws) là khá nhiều thông tin. Cảm ơn bạn đã trả lời –
Bạn được chào đón. Bài đăng đó liên quan đến một vấn đề hoàn toàn khác, nhưng một tiền đề tương tự là ở đó. – BoltClock