簡體   English   中英

C# EventHandler 文檔代碼示例

[英]C# EventHandler documentation code example

我正在閱讀有關 EventHandlers 的 .NET 文檔,但不理解來自https://docs.microsoft.com/en-us/dotnet/standard/events/的這段代碼:

class Counter
{
    public event EventHandler ThresholdReached;

    protected virtual void OnThresholdReached(EventArgs e)
    {
        EventHandler handler = ThresholdReached;
        handler?.Invoke(this, e);
    }

    // provide remaining implementation for the class
}

局部變量handler的目的是什么? 為什么不直接調用TresholdReached TresholdReached?.Invoke(this, e); ? 類似的例子在這里: https://docs.microsoft.com/en-us/dotnet/api/system.eventhandler-1?view=net-5.0

局部變量handler的目的是什么?

可能沒有。 在代碼正確性方面當然沒有理由。 它似乎是文檔的舊的、前置空條件運算符版本的保留,其中需要將事件字段ThresholdReached復制到局部變量中,以便安全地解決引發事件和任何其他代碼之間的競爭條件可能會退訂它。 正如您所指出的,使用空條件運算符,代碼可以只是一行,通過事件字段本身調用。

我只說“可能”是因為我猜文檔的作者希望通過更明確的代碼形式實現其他教學目標的可能性很小。 但我無法想象那可能是什么,而且它顯然會干擾對代碼的一般理解(即分散對重要部分的注意力)。

我在頁面上提交了評論,讓 Microsoft 知道該問題。 我認為 Microsoft Git 存儲庫中可能還有一個位置,如果您願意,您可以在其中提交文檔問題。

我的經驗是,無論以何種方式將問題傳達給 Microsoft,他們通常都會在相對較短的時間內解決問題。 我猜想在接下來的幾周內,該段落將被修復,而這個問題將不再相關。 :)

最后,我在發布這個問題后幾乎立即找到了答案(這讓我困擾了好幾天)。 閱讀 @lc. 的回答並對此問題發表評論: 事件 - 命名約定和樣式將我帶到此頁面: https://docs.microsoft.com/en-us/archive/blogs/ericlippert/events-and-races

所以答案是:本地處理程序變量有效地復制不可變委托並使其成為線程安全的。 他們本可以在那個文檔頁面上提到它。

編輯:見@Peter Duniho 的回答和評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM