W konstruktorze obiektu, Listener
, pobieramy argument i subskrybujemy jedno z jego zdarzeń. Jeśli wyjątek zostanie zgłoszony w konstruktorze po zasubskrybowaniu zdarzenia, metoda zostanie wywołana, gdy zdarzenie zostanie wywołane - nawet jeśli obiekt nie został pomyślnie skonstruowany i, o ile mi wiadomo, żadne wystąpienie nie istnieje.Lokalny detektor zdarzeń wywołany, mimo że obiekt nie został skonstruowany
Teraz mogę to naprawić, oczywiście nieznacznie zmieniając projekt, jednak bardziej interesuje mnie, dlaczego metoda instancji jest wywoływana, mimo że konstruktor nie zakończył się pomyślnie? Jeśli metoda używa dowolnych zmiennych lokalnych, które nie zostały zainicjowane przed wyjątkiem, to oczywiście przechodzi w 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);
}
}
To naprawdę niezwykle interesujące i nie to, czego się spodziewałem. Znalazłem również [ten post] (http://stackoverflow.com/questions/5697446/is-an-object-constructed-if-an-initializer- throws) jako dość interesujący. Dziękujemy za odpowiedź –
Nie ma za co. Ten post dotyka zupełnie innej sprawy, ale istnieje podobna przesłanka. – BoltClock