Na przykład, mam metodę baza publikowania zdarzeń:.NET: Czy tworzenie nowych EventArgs za każdym razem, gdy zdarzenie uruchamia dobrą praktykę?
protected virtual OnSomeEvent(EventArgs e)
{
var handler = SomeEvent;
if (handler != null)
{
handler(this, e);
// handler(this, new EventArgs());// EDIT: Yes it should be
// handler(this, e),
// ignore this one :D
}
}
dla klasy pochodnej, która nadpisuje OnSomeEvent
i wnosi dodatkową zdarzenie, kiedy to pożary:
protected override OnSomeEvent(EventArgs e)
{
base.OnSomeEvent(e);
if (ExtendedEvent != null)
{
OnExtendedEvent(e);
}
}
protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point
ExtendedEvent(this, new ExtendedEventArgs(someStuff, someOtherStuff));
}
A jeśli wyprowadzenie idzie na tak , utworzy nowe wyprowadzone EventArgs dla każdej generacji klasy pochodnej, która tego wymaga. Jednak wydaje się, że różne wyprowadzenia z EventArgs
na platformie .NET nie są zaprojektowane jako zmienne (bez ustawiania), to zniechęca obiekt do utrzymywania pojedynczej instancji EventArgs i modyfikowania jej w trakcie.
Za każdym razem, gdy zostanie wywołane takie zdarzenie, ponownie przydzielą pamięć dla wszystkich zaangażowanych obiektów EventArgs
. W graficznej, intensywnej aplikacji, w której zdarzenie może być uruchamiane dziesiątki razy na sekundę (na przykład zdarzenie OnPaint
na kontrolce), czy to naprawdę dobra praktyka?
Czy należy wprowadzić pewne zmiany w OnExtendedEvent()
i zmienić wartość ExtendedEventArgs
, aby uzyskać następujące możliwości?
protected ExtendedEventArgs extendedArgs = ExtendedEventArgs.Empty;
protected void OnExtendedEvent(EventArgs e)
{
// some stuff done
// new information the ExtendedEventArgs object needs
// is not available until this point
extendedArgs.someProperty1 = someStuff;
extendedArgs.someProperty2 = someOtherStuff;
ExtendedEvent(this, extendedArgs);
}
EDYCJA: Naprawiono przykładowy kod, teraz powinien być wyraźniejszy.
Wyprowadzanie nie jest problemem, klasa pochodna może wywoływać tylko base.OnExtendedEvent z EventArgs.Empty. Ogólnie rzecz biorąc, nie bój się tworzyć krótkotrwałych śmieci. –
Myślę, że masz na myśli niezmienny zamiast zmiennego. Niezmienny oznacza, że nie możesz go zmienić. – aaronb