widziałem tego rodzaju kodu kilka miejsc:C#: Inicjowanie programu obsługi zdarzeń z manekina
public event SomeEventHandler SomeEvent = (s, e) => { };
Czy to zalecany sposób robienia rzeczy? Co to rozwiązuje i czy ma jakieś godne uwagi efekty uboczne? Czy nadal będę musiał sprawdzać wartości null? Czy jest to dokładnie to, czego nie muszę robić? Czy wywóz śmieci nadal działa tak, jak powinien?
Na przykład:
private PropertyChangedEventHandler propertyChanged;
private readonly object propertyChangedLock = new object();
public event PropertyChangedEventHandler PropertyChanged
{
add
{
lock (propertyChangedLock)
propertyChanged += value;
}
remove
{
lock (propertyChanged)
propertyChanged -= value;
}
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler;
lock (propertyChangedLock)
handler = propertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
Czy mogę zmienić pierwszą linię do tego:
private PropertyChangedEventHandler propertyChanged = (s, e) => { };
a następnie przejdź null-czek w metodzie OnPropertyChanged? A jeśli pominiemy kontrolę zerową, czy mogę pominąć blokadę? Jeśli tak, to dałoby mi to:
protected void OnPropertyChanged(string propertyName)
{
propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
Czy byłoby to bezpieczne, biorąc pod uwagę inicjalizację? Czy są jakieś efekty uboczne, które przeoczyłem?
Mój artykuł na ten temat: http://blogs.msdn.com/ericlippert/archive/2009/04/29/events-and-races.aspx –
Przyjemny artykuł! Innymi słowy, usunięcie kontroli zerowej byłoby w tym przypadku wątkowo bezpieczne. Ale subskrybenci muszą mieć inteligentne procedury obsługi, które się nie psują. Czy to rozumiem? – Svish