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
是不能被取消的实例.