Montaje descompilado - código inusual
Descompilé un ensamblaje usando ILSpy, y una clase en particular llamó mi atención:
public class CustomTextStream : NetworkStream
{
private EventHandler<CustomEventArgs> someEvent;
public event EventHandler<CustomEventArgs> SomePublicEvent
{
add
{
EventHandler<CustomEventArgs> eventHandler = this.someEvent;
EventHandler<CustomEventArgs> eventHandler2;
do
{
eventHandler2 = eventHandler;
EventHandler<CustomEventArgs> value2 =
(EventHandler<CustomEventArgs>)Delegate.Combine(eventHandler2, value);
eventHandler =
Interlocked.CompareExchange<EventHandler<CustomEventArgs>>(
ref this.someEvent, value2, eventHandler2);
}
while (eventHandler != eventHandler2);
}
remove
{
// similar stuff...
}
}
}
Más adelante en el código, parece que el delegado privado se usa para disparar un evento real:
if (something != null && somethingElse != 0)
{
this.someEvent(this, new CustomEventArgs(someArg));
}
La pregunta: ¿Puede alguien adivinar cuál podría ser la idea detrás de estos accesores personalizados, suponiendo que no se haya realizado alguna "magia de compilación / descompilación"? No estoy muy familiarizado con IL, por cierto ...
(Nota: la aplicación es multiproceso y utiliza redes, obviamente).