Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反编译程序集-异常代码_C#_.net_Events_Decompiling_Ilspy - Fatal编程技术网

C# 反编译程序集-异常代码

C# 反编译程序集-异常代码,c#,.net,events,decompiling,ilspy,C#,.net,Events,Decompiling,Ilspy,我使用ILSpy反编译了一个程序集,其中一个类特别引起了我的注意: public class CustomTextStream : NetworkStream { private EventHandler<CustomEventArgs> someEvent; public event EventHandler<CustomEventArgs> SomePublicEvent { add {

我使用ILSpy反编译了一个程序集,其中一个类特别引起了我的注意:

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...
        }
    }
}
问题是:假设没有发生“编译/反编译魔法”,有人能猜出这个自定义访问器背后的想法吗?我不太熟悉IL,顺便说一句


(旁注:应用程序显然是多线程的,并利用网络。)

这是一个由编译器生成的新事件处理程序代码。它是在C#4中引入的(C#3版本不同)

Interlocked.CompareExchange将第一个参数与第三个参数进行比较,如果它们相等,则将第一个参数替换为第二个参数。这是一个线程安全的操作。循环用于在分配变量eventHandler2之后和检查之前,另一个线程更改此委托的情况。在这种情况下,Interlocated.CompareeExchange不执行交换,循环条件的计算结果不为true,并进行下一次尝试

C#3在事件处理程序中生成的简单代码:

add { lock(this) { changed = changed + value; } }
它的性能较低,可能会导致死锁

有一系列关于这个主题的文章:


乍一看像是默认代码-正常的“事件”实际上与此代码相近。试着用一个事件来创建代码,而不是反编译。我看到了一些奇怪的东西,这些都是由混淆者产生的。这让Alexei Levenkov很困惑。“我已经做过了。我没有得到同样的结果。“正常”反编译事件中的唯一内容是
Delegate.Combine()
part@Snoopy这个想法也进入了我的脑海:)实际上很可能这就是混淆结果,它只是C#v4+编译器在您不编写自己的添加/删除访问器时生成的默认代码。只需编写
公共事件事件处理程序foo并使用反汇编程序查看它。
add { lock(this) { changed = changed + value; } }