C# Ereignisse, Threadsicherheit und NullReferencexceptions: Ein praktischer Ansatz
vielen C# -Entätern wird empfohlen, Ereignisse zu kopieren, bevor sie aufgerufen werden, um NullReferenceException
Fehler und Rassenbedingungen in Multithread -Umgebungen zu verhindern. Die Argumentation ist, dass der Ereignishandler zwischen der Nullprüfung und dem Aufruf entfernt werden kann.
ist jedoch einfach das Kopieren des Ereignisses keine vollständige Lösung. Die Kopie könnte abgestanden sein, wenn das Ereignis nicht volatil ist und ein NullReferenceException
immer noch auftreten könnte. Das eigentliche Problem besteht darin, sicherzustellen, dass Ereignishändler robust genug sind, um die Absubscription zu bewältigen.
Der Standardansatz beinhaltet eine explizite Nullprüfung:
<code class="language-csharp">// Traditional approach with null check EventHandler handler = SomeEvent; if (handler != null) { handler(this, e); }</code>
Eine elegantere und wohl sicherere Lösung besteht darin, das Ereignis mit einem leeren Delegierten zu initialisieren:
<code class="language-csharp">SomeEvent += (sender, args) => { }; // Initialize with an empty action</code>
Dies beseitigt die Notwendigkeit von wiederholten Nullprüfungen.
Seit C# 6 bietet der Null-Konditionelle Bediener eine prägnante und effiziente Lösung:
<code class="language-csharp">SomeEvent?.Invoke(this, e);</code>
Diese einzelne Zeile behandelt die Nullprüfung und den Aufruf anmutig. Es ist der empfohlene Ansatz für die meisten Szenarien.
Es ist wichtig, sich daran zu erinnern, dass diese Techniken das Problem der Nichtigkeit ansprechen und nicht unbedingt die vollständige Gewindesicherheit. Für eine wirklich robuste Gewindesicherheit in Situationen mit hoher Konsequenz können umfassendere Synchronisationsmechanismen (z. B. Schlösser) erforderlich sein. Der beste Ansatz hängt von den Anforderungen der spezifischen Anwendung und der erforderlichen Gewindesicherheit ab.
Das obige ist der detaillierte Inhalt vonC# Ereignisse und Thread -Sicherheit: Muss ich Ereignisse wirklich kopieren, bevor ich aufgerufen habe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!