默认(CancellationToken)如何具有相应的CancellationTokenSource

i3a*_*non 10 .net c# cancellationtokensource cancellation-token

当我创建一个默认的CancellationToken,我可以在该调试器中看到CancellationToken有一个CancellationTokenSource与它存储在私有关联的m_source领域:

不是空的

我想知道如何对于结构default关键字"将返回结构的每个成员初始化为零或取决于它们是值还是引用类型"并且CancellationTokenSource是引用类型.

CancellationToken确实有2个构造函数设置这个字段然而它们是不相关的,因为default(CancellationToken)不调用构造函数和new CancellationToken()(它具有完全相同的行为)不会调用构造函数,因为结构不能有无参数构造函数(尚未).

i3a*_*non 13

default(CancellationToken)并创建一个CancellationToken地方m_sourcenull.您可以通过使用反射获取该私有字段的值来查看:

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

输出:

null
Run Code Online (Sandbox Code Playgroud)

您还可以通过仅调试调试器中的相关字段来查看:

空值

那么,会发生什么?

调试器为了显示其内容,CancellationToken逐个访问其属性.当内CancellationTokenSourcenullWaitHandle属性创建并设置一个默认CancellationTokenSource委托给它的前WaitHandle财产:

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

        return m_source.WaitHandle;
    }
}
Run Code Online (Sandbox Code Playgroud)

总之,default(CancellationToken)new CancellationToken创造一个空的结构m_sourcenull,但看在调试器的结构,你正在填补这一领域具有默认CancellationTokenSource是不能被取消的实例.