36

看着执行CancellationToken.None,简直就是回归default(CancellationToken)。但是,我在CancellationToken的文档中没有看到两者是等价的。

我想提供一个这样的 API,但直到我确定它总是可以工作:

Task DoSomething(CancellationToken token = default(CancellationToken))

它定义的行为default(CancellationToken)是否与 相同CancellationToken.None,或者这只是一个实现细节?

4

5 回答 5

39

在向corefx提交问题后,文档备注已更新,以使其成为有保证的功能:

您还可以使用 C#default(CancellationToken)语句创建一个空的取消标记。

于 2015-09-17T15:24:52.377 回答
24

他们是一样的。检查源代码

public static CancellationToken None
{
    get { return default(CancellationToken); }
}

来自https://referencesource.microsoft.com/#mscorlib/system/threading/CancellationToken.cs,36b17ded8b1a228c

于 2014-04-11T11:20:13.333 回答
8

CancellationToken.None只需返回新的 CancellationToken:

public static CancellationToken None
{    
    get
    {
        return new CancellationToken();
    }
}

因此CancellationToken是一个结构,然后default(CancellationToken)将返回相同的值。C# 规范 5.2:

对于 value-type 的变量,默认值与 value-type 的默认构造函数计算的值相同

更新:此行为未在 MSDN 上定义,因此您只能依赖当前的实现。

于 2013-10-23T13:57:15.367 回答
1

default为每种类型定义。它null用于引用类型。它是结构的“空”实例,即所有属性都初始化为其各自默认值的实例。

于 2013-10-23T14:00:26.490 回答
0

是的,它们是等价的。您可以使用 Visual Studio 中的 QuickWatch 功能进行检查:

在此处输入图像描述

于 2021-11-02T09:10:03.520 回答