default(CancellationToken) 如何有相应的 CancellationTokenSource
How can a default(CancellationToken) have a corresponding CancellationTokenSource
当我创建默认 CancellationToken
时,我可以在调试器中看到 CancellationToken
有一个与之关联的 CancellationTokenSource
存储在私有 m_source
字段中:
我想知道 default
关键字 "will return each member of the struct initialized to zero or null depending on whether they are value or reference types" 和 CancellationTokenSource
是引用类型的结构怎么可能。
CancellationToken
确实有 2 个设置此字段的构造函数,但是它们是无关紧要的,因为 default(CancellationToken)
不调用构造函数并且 new CancellationToken()
(具有完全相同的行为)不调用调用构造函数,因为结构不能有无参数构造函数 (yet).
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
属性 在委托给它的 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
但 by looking at the struct in the debugger you are filling that field 具有默认的 CancellationTokenSource
实例无法取消。
当我创建默认 CancellationToken
时,我可以在调试器中看到 CancellationToken
有一个与之关联的 CancellationTokenSource
存储在私有 m_source
字段中:
我想知道 default
关键字 "will return each member of the struct initialized to zero or null depending on whether they are value or reference types" 和 CancellationTokenSource
是引用类型的结构怎么可能。
CancellationToken
确实有 2 个设置此字段的构造函数,但是它们是无关紧要的,因为 default(CancellationToken)
不调用构造函数并且 new CancellationToken()
(具有完全相同的行为)不调用调用构造函数,因为结构不能有无参数构造函数 (yet).
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
属性 在委托给它的 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
但 by looking at the struct in the debugger you are filling that field 具有默认的 CancellationTokenSource
实例无法取消。