默认(CancellationToken)是否等同于CancellationToken.None?

Cor*_*son 28 .net linq ado.net cancellation-token

看看CancellationToken.None它的实现,它只是回归default(CancellationToken).但是,我在CancellationToken文档中看不到两者是等价的.

我想提供这样的API,但直到我确定它总能工作:

Task DoSomething(CancellationToken token = default(CancellationToken))
Run Code Online (Sandbox Code Playgroud)

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

Cor*_*son 30

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

您还可以使用C#default(CancellationToken)语句创建空的取消令牌.


qxg*_*qxg 16

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

public static CancellationToken None
{
    get { return default(CancellationToken); }
}
Run Code Online (Sandbox Code Playgroud)

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


Ser*_*kiy 6

CancellationToken.None 只需返回新的CancellationToken:

public static CancellationToken None
{    
    get
    {
        return new CancellationToken();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 我的问题是关于这是*定义的行为*,我可以依赖的东西,还是只是一个实现细节. (2认同)
  • 避免使用反编译器,这不是真正的源代码.请改用参考源. (2认同)