2015-03-30 16 views
8

Ben CancellationToken özel m_source alanında depolanan kendisiyle ilişkilendirilmiş bir CancellationTokenSource sahip olduğunu ayıklayıcısında görebileceğiniz karşılık gelen CancellationTokenSource olabilir Nasıl:varsayılan (CancellationToken) Ben varsayılan <code>CancellationToken</code> oluşturduğunuzda

Not null

"will return each member of the struct initialized to zero or null depending on whether they are value or reference types" ve CancellationTokenSource anahtar sözcükleri default numaralı anahtar sözcükler için nasıl bir referans türü olabileceğini merak ediyorum.

CancellationToken (yet onlar parametresiz kurucuya sahip olamaz yapılar çünkü bir kurucu çağırmaz Kurucular ve new CancellationToken() (tam olarak aynı davranışa sahip olan) çağırmaz default(CancellationToken) olarak alakasız ancak bu alanı ayarlayın 2 kurucular var).

cevap

11

default(CancellationToken)m_sourcenull bir CancellationToken olduğu yaratır. Sen yansıma kullanarak bu özel alanın değerini alarak görebiliriz:

Console.WriteLine(typeof (CancellationToken). 
    GetField("m_source", BindingFlags.NonPublic | BindingFlags.Instance). 
    GetValue(default(CancellationToken)) ?? "null"); 

Çıktı:

null 

Ayrıca görebilirsiniz ayıklayıcısında sadece ilgili alan pining tarafından:

null

Peki, ne oluyor?

Hata ayıklayıcı, CancellationToken'un içeriğini görüntülemek için, özelliklerine tek tek erişir. İç CancellationTokenSourcenull olduğunda WaitHandle mülkiyet yaratır ve WaitHandle özelliğine temsilciliği önce varsayılan CancellationTokenSource ayarlar: m_source varsayılan CancellationTokenSource örneği ile null ama by looking at the struct in the debugger you are filling that field olduğu

Sonuç olarak
public WaitHandle WaitHandle 
{ 
    get 
    { 
     if (m_source == null) 
     { 
      m_source = CancellationTokenSource.InternalGetStaticSource(false); 
     } 

     return m_source.WaitHandle; 
    } 
} 

, default(CancellationToken) ve new CancellationToken boş yapı oluşturmak Bu iptal edilemez.

+5

Ah, klasik bir [Heisenbug] (http://en.wikipedia.org/wiki/Heisenbug). –