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_source是null.您可以通过使用反射获取该私有字段的值来查看:
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逐个访问其属性.当内CancellationTokenSource是null的WaitHandle属性创建并设置一个默认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_source是null,但看在调试器的结构,你正在填补这一领域具有默认CancellationTokenSource是不能被取消的实例.