bir olay işleyicisi başlatılıyor:C#: Ben bu kod sıralamak bazı yerlerde gördüğüm bir kukla
public event SomeEventHandler SomeEvent = (s, e) => { };
mi şeyler yapmanın önerilen bir yol olduğunu? Ne çözer ve kayda değer bir yan etkisi var mı? Hala boş çekler yapmak zorunda mıyım? Ya da daha fazla yapmak zorunda olmadığım şey bu mu? Çöp toplama hala gerektiği gibi çalışacak mı? Örneğin
:
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));
}
ben bu işe ilk satırını değiştirebilir mi:
private PropertyChangedEventHandler propertyChanged = (s, e) => { };
Sonra OnPropertyChanged yönteminde boş-denetlemeyi atlamak? Ve sonra null-check'i atlarsam kilidi de atlayabilir miyim? Eğer öyleyse, bunu bana verirdi:
protected void OnPropertyChanged(string propertyName)
{
propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
Başlatma hesaba katılırken bu güvenli midir? Yoksa özlediğim bazı yan etkiler var mı?
My madde: http://blogs.msdn.com/ericlippert/archive/2009/04/29/events-and-races.aspx –
Güzel makale! Diğer bir deyişle, boş çekmeyi kaldırmak bu durumda iş parçacığı güvenli olur. Ancak abonelerin kırılmayan akıllı işleyicileri olması gerekiyor. Bunu doğru mu yaptım? – Svish