gpt4 book ai didi

c# - 使用带有私有(private)成员分配的关键字来管理 IDisposable

转载 作者:行者123 更新时间:2023-12-05 03:22:12 25 4
gpt4 key购买 nike

我正在阅读 Stephen Cleary's blog post about cancellation ,我在以下代码片段中看到了以前从未见过的东西。

Constructor() => CancelButton.Enabled = false;

private CancellationTokenSource? _cts;

async void StartButton_Click(..)
{
StartButton.Enabled = false;
CancelButton.Enabled = true;

// Create a CTS for manual cancellation requests.
using var cts = _cts = new();

try
{
// Pass the token for that CTS to lower-level code.
await DoSomethingAsync(_cts.Token);
.. // Display success in UI.
}
catch (Exception ex)
{
.. // Display error in UI.
}
finally
{
StartButton.Enabled = true;
CancelButton.Enabled = false;
}
}

async void CancelButton_Click(..)
{
// Manually cancel the CTS.
_cts!.Cancel();
}

特别是 using var cts = _cts = new(); 行。

using 是否管理私有(private)成员和局部变量的处置?

如果没有在任何地方使用,为什么要分配局部变量?

这是怎么回事?

最佳答案

这仅仅是因为你不能这样做:

using _cts = new();

这将给出一个编译错误,“需要标识符”。

所以他引入了一个局部变量,该变量将在方法结束时被释放:

using var cts = _cts = new();

现在它将编译,并且 cts 将被释放(注意:它不会释放 _cts;它只会释放引入的局部变量,cts)。

他想初始化一个字段_cts,并在方法结束时自动释放创建的对象,这是一种简单的方法。

另一种写法:

_cts = new();
using var cts = _cts;

另一种看起来不那么奇怪的写法是有一个初始化 _cts 并返回它的方法:

CancellationTokenSource initialiseCancellationToken()
{
var cts = new CancellationTokenSource();
_cts = cts;
return cts;
}

然后你会写出不那么令人惊讶的:

using var cts = initialiseCancellationToken();

您付钱并做出选择!

注意:您可能会想这样写:

CancellationTokenSource initialiseCancellationToken()
{
_cts = new CancellationTokenSource();
return _cts;
}

但这有一个微妙的竞争条件!你能发现它吗(假设 initialiseCancellationToken() 可以被多个线程同时调用)?

关于c# - 使用带有私有(private)成员分配的关键字来管理 IDisposable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72789663/

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