Assemblage décompilé – code inhabituel

J’ai décompilé un assemblage avec ILSpy, et une classe en particulier a attiré mon attention:

public class CustomTextStream : NetworkStream { private EventHandler someEvent; public event EventHandler SomePublicEvent { add { EventHandler eventHandler = this.someEvent; EventHandler eventHandler2; do { eventHandler2 = eventHandler; EventHandler value2 = (EventHandler)Delegate.Combine(eventHandler2, value); eventHandler = Interlocked.CompareExchange<EventHandler>( ref this.someEvent, value2, eventHandler2); } while (eventHandler != eventHandler2); } remove { // similar stuff... } } } 

Plus loin dans le code, on dirait qu’un délégué privé est utilisé pour déclencher un événement réel:

 if (something != null && somethingElse != 0) { this.someEvent(this, new CustomEventArgs(someArg)); } 

La question: quelqu’un peut-il deviner quelle pourrait être l’idée de ces accesseurs personnalisés, en supposant que de la “magie de compilation / décompilation” n’a pas eu lieu? Je ne connais pas beaucoup IL, en fait …

(Remarque: l’application est multi-thread et utilise évidemment la mise en réseau.)

Il s’agit d’un nouveau code de gestionnaire d’événements généré par le compilateur. Il a été introduit en C # 4 (la version C # 3 était différente)

Interlocked.CompareExchange compare le premier argument avec le troisième et, s’ils sont égaux, remplace le premier argument avec le deuxième. Ceci est une opération thread-safe. La boucle est utilisée dans un cas où, après l’atsortingbution d’une variable eventHandler2 et avant la vérification, un autre thread modifie ce délégué. Dans ce cas, Interlocked.CompareExchange n’effectue pas d’échange, la condition de boucle n’est pas évaluée à true et la tentative suivante est effectuée.

C # 3 a généré un code simple dans les gestionnaires d’événements:

 add { lock(this) { changed = changed + value; } } 

Qui avait des performances inférieures et pourrait introduire des blocages.

Il existe une grande série d’articles sur ce sujet:

Les événements se refont un peu en C 4

Les événements se refont un peu en C 4, 2e partie