繁体   English   中英

检测可空的变化

[英]Detect Nullable change

我想ClearCancellationTokenSource ,当我调用CancellationToken _loadingCts

private CancellationTokenSource? _loadingCts = null;
     
private async Task LoadDataAsync()
{
    ClearCancellationTokenSource(_loadingCts, true);
    await foreach (var item in service.GetDataAsync(_loadingCts.Token))
    {

    }
}

private void ClearCancellationTokenSource(CancellationTokenSource? cts, bool createNewTokenSource = false)
{
    cts?.Cancel();
    cts?.Dispose();

    if(createNewTokenSource)
    {
        cts = new CancellationTokenSource();
    }
}

正如您在上面的代码示例中看到的那样,当我使用 true 调用 function 时, _loadingCts不是 null,因为它是在此方法中初始化的。

当我使用 true 调用此方法后尝试访问_loadingCts.Token时,我收到编译器警告 CS8602。

有没有什么办法解决这一问题? 我不想再做另一个 nulöl 检查只是为了摆脱警告。 ! 也不是一个选项,因为当我再次尝试从我的CancellationTokenSource访问任何内容时,将再次显示警告。

using System.Diagnostics.CodeAnalysis;

// ...

private void DisposeCancellationTokenSource(CancellationTokenSource? cts)
{
    cts?.Cancel();
    cts?.Dispose();
}

private void RecreateCancellationTokenSource([NotNull] ref CancellationTokenSource? cts)
{
    ClearCancellationTokenSource(cts);
    cts = new CancellationTokenSource();
}

[NotNull]属性告诉编译器参数cts的参数在调用后将包含一个非空值。 不可能使 NotNull 以另一个 bool 参数的值为条件,因此最简单的方法是将您的方法拆分为两个方法,而不是让一个方法带有 bool 参数。

ref使得当您将新的 object 分配给传递给方法的变量时,新的 object 实际上对调用者可见。 否则,只能通过在同一个 object 上更改 state 来进行调用者可见的更改。 因为只有Recreate分配了一个新的 object,所以它是唯一需要refClear不需要它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM