当我创建默认CancellationToken
时,我可以在调试器中看到CancellationToken
与CancellationTokenSource
相关联的m_source
存储在私有default
字段中:< / p>
我想知道结果如何CancellationTokenSource
关键字"will return each member of the struct initialized to zero or null depending on whether they are value or reference types"和CancellationToken
是引用类型。
default(CancellationToken)
确实有2个构造函数可以设置此字段,但它们无关紧要,因为new CancellationToken()
没有调用构造函数,而{{1}}(具有完全相同的行为)并不是&#39 ; t调用一个构造函数,因为结构体不能有无参数构造函数(yet)。
答案 0 :(得分:13)
default(CancellationToken)
会创建一个CancellationToken
,其中m_source
为null
。您可以通过使用反射获取该私有字段的值来查看:
Console.WriteLine(typeof (CancellationToken).
GetField("m_source", BindingFlags.NonPublic | BindingFlags.Instance).
GetValue(default(CancellationToken)) ?? "null");
输出:
null
您还可以通过仅调试调试器中的相关字段来查看:
那么,会发生什么?
为了显示CancellationToken
的内容,调试器逐个访问其属性。当内部CancellationTokenSource
为null
时,WaitHandle
属性会在委托给其CancellationTokenSource
属性之前创建并设置默认WaitHandle
:
public WaitHandle WaitHandle
{
get
{
if (m_source == null)
{
m_source = CancellationTokenSource.InternalGetStaticSource(false);
}
return m_source.WaitHandle;
}
}
总之,default(CancellationToken)
和new CancellationToken
创建一个空结构,其中m_source
为null
但by looking at the struct in the debugger you are filling that field具有默认CancellationTokenSource
实例,可以不会被取消。