default(CancellationToken) 如何有相应的 CancellationTokenSource

How can a default(CancellationToken) have a corresponding CancellationTokenSource

当我创建默认 CancellationToken 时,我可以在调试器中看到 CancellationToken 有一个与之关联的 CancellationTokenSource 存储在私有 m_source 字段中:

我想知道 default 关键字 "will return each member of the struct initialized to zero or null depending on whether they are value or reference types"CancellationTokenSource 是引用类型的结构怎么可能。

CancellationToken 确实有 2 个设置此字段的构造函数,但是它们是无关紧要的,因为 default(CancellationToken) 不调用构造函数并且 new CancellationToken()(具有完全相同的行为)不调用调用构造函数,因为结构不能有无参数构造函数 (yet).

default(CancellationToken) 确实创建了一个 CancellationToken,其中 m_sourcenull。您可以通过使用反射获取该私有字段的值来看到这一点:

Console.WriteLine(typeof (CancellationToken).
    GetField("m_source", BindingFlags.NonPublic | BindingFlags.Instance).
    GetValue(default(CancellationToken)) ?? "null");

输出:

null

您还可以通过在调试器中仅固定相关字段来看到:

那么,会发生什么?

调试器,为了显示CancellationToken的内容,一个一个地访问它的属性。当内部 CancellationTokenSourcenull 时,WaitHandle 属性 在委托给它的 WaitHandle 属性 之前创建并设置默认值 CancellationTokenSource

public WaitHandle WaitHandle
{
    get
    {
        if (m_source == null)
        {
             m_source = CancellationTokenSource.InternalGetStaticSource(false);
        }

        return m_source.WaitHandle;
    }
}

总之,default(CancellationToken)new CancellationToken 创建了一个空结构,其中 m_sourcenullby looking at the struct in the debugger you are filling that field 具有默认的 CancellationTokenSource 实例无法取消。