Локальный прослушиватель событий вызван, даже если объект не удалось создать

В конструкторе объекта, 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);
    }
}
8
задан BoltClock 2 August 2011 в 16:08
поделиться