默认(CancellationToken)如何具有相应的CancellationTokenSource
当我创建一个默认的CancellationToken
我可以在调试器中看到CancellationToken
有一个与之关联的CancellationTokenSource
,它存储在私有m_source
字段中:
我想知道如何对于结构, default
关键字“将返回结构的每个成员初始化为零或取决于它们是值还是引用类型”并且CancellationTokenSource
是引用类型。
CancellationToken
确实有2个构造函数设置这个字段然而它们是无关紧要的default(CancellationToken)
不调用构造函数和new CancellationToken()
(具有完全相同的行为)不调用构造函数因为结构不能有无参数构造函数( 还 )。
default(CancellationToken)
确实创建了一个CancellationToken
,其中m_source
为null
。 您可以通过使用reflection获取该私有字段的值来看到:
Console.WriteLine(typeof (CancellationToken). GetField("m_source", BindingFlags.NonPublic | BindingFlags.Instance). GetValue(default(CancellationToken)) ?? "null");
输出:
null
您还可以通过仅调试调试器中的相关字段来查看:
那么,会发生什么?
为了显示CancellationToken
的内容,调试器逐个访问其属性。 当内部CancellationTokenSource
为null
, 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_source
为null
但是通过查看调试器中的结构,您将使用无法取消的默认CancellationTokenSource
实例填充该字段 。