"Besser"? Nun, enthält keine (spezifische) Race Condition, tut man. MultiCastDelegate-Typen sind unveränderlich und verwenden Werttyp-Semantik auf alle relevanten Arten (sie sind sind Referenztypen jedoch siehe this und, noch wichtiger, this), deshalb weisen Sie sie zuerst zu und dann überprüfen. Das Problem ist das:
// this evaluates to true...
if(SomeEvent != null)
{
// ...but before this line executes, the last
// subscriber detached, and now SomeEvent is null. Oops.
SomeEvent(this, e);
}
Sie sollten gefragt haben "warum sollte jemand Beispiel # 2 verwenden?"
Als beiseite, das ist ein großartiger Ort, eine implizit typisierte Variablen zu verwenden (var
). Diese Delegattypnamen werden lang ...
Interessant ist auch, dass eine Race-Bedingung immer noch existiert, es ist nur subtiler. Was passiert, wenn ein Teilnehmer nach der Zuweisung entfernt wird? Nun, es wird immer noch angerufen werden, aber es gibt wirklich nichts (ich weiß), dass Sie es tun können.
http://stackoverflow.com/questions/3668953/raise-event-thread-safely-best-practice?rq=1 –
Option # 2 mit implizit typisierter Variable. Ich möchte hinzufügen, dass, wenn Leistung kein Problem ist, sich nicht darum kümmern. Lieber Lesbarkeit und Wartbarkeit bevorzugen. – jay