gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:28:25 25 4
gpt4 key购买 nike

我使用 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...
}
}
}

在代码中,似乎私有(private)委托(delegate)用于触发实际事件:

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

问题:如果没有发生某些“编译/反编译魔术”,有人能猜出这个自定义访问器背后的想法是什么吗?我对 IL 不太熟悉,顺便说一句......

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

最佳答案

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

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

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

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

性能较低,可能会引入死锁。

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

Events get a little overhaul in C# 4

Events get a little overhaul in C# 4, Part II

关于c# - 反编译的程序集 - 异常代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15646155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com