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

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

不是空的

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

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

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

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

输出:

 null 

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

空值

那么,会发生什么?

为了显示CancellationToken的内容,调试器逐个访问其属性。 当内部CancellationTokenSourcenullWaitHandle属性在委托其WaitHandle属性之前创建并设置默认的CancellationTokenSource

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

总之, default(CancellationToken)new CancellationToken创建一个空结构,其中m_sourcenull但是通过查看调试器中的结构,您将使用无法取消的默认CancellationTokenSource实例填充该字段 。