C # Événements, sécurité des threads et NullReferenceExceptions: une approche pratique
De nombreux développeurs C # sont invités à copier des événements avant de les invoquer pour empêcher les erreurs NullReferenceException
et les conditions de course dans des environnements multithreads. Le raisonnement est que le gestionnaire d'événements pourrait être supprimé entre le contrôle nul et l'invocation.
Cependant, la simple copie de l'événement n'est pas une solution complète. La copie peut être périmée si l'événement n'est pas volatil, et un NullReferenceException
pourrait encore se produire. Le vrai problème est de garantir que les gestionnaires d'événements sont suffisamment robustes pour gérer la désinscription.
L'approche standard implique une vérification nul explicite:
<code class="language-csharp">// Traditional approach with null check EventHandler handler = SomeEvent; if (handler != null) { handler(this, e); }</code>
Une solution plus élégante et sans doute plus sûre consiste à initialiser l'événement avec un délégué vide:
<code class="language-csharp">SomeEvent += (sender, args) => { }; // Initialize with an empty action</code>
Cela élimine le besoin de vérifications nulles répétées.
Depuis C # 6, l'opérateur de conditionnement nulle fournit une solution concise et efficace:
<code class="language-csharp">SomeEvent?.Invoke(this, e);</code>
Cette ligne unique gère le contrôle nul et l'invocation gracieusement. C'est l'approche recommandée pour la plupart des scénarios.
Il est important de se rappeler que ces techniques abordent le problème de nullité, pas nécessairement la sécurité complète du fil. Pour une sécurité de fil vraiment robuste dans des situations de monuil à haute curances, des mécanismes de synchronisation plus complets (par exemple, des verrous) peuvent être nécessaires. La meilleure approche dépend des exigences de l'application spécifique et du niveau de sécurité du thread nécessaire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!