Wie kann ein Standard (CancellationToken) eine entsprechende CancellationTokenSource haben

8

Wenn ich einen Standard CancellationToken erstelle, kann ich im Debugger sehen, dass CancellationToken eine CancellationTokenSource zugeordnet hat, die im privaten m_source Feld gespeichert ist:

Ich frage mich, wie das für Strukturen sein kann, die das default Schlüsselwort "zurückgibt Jedes Element der Struktur wurde auf Null oder Null initialisiert, je nachdem, ob es sich um Wert oder Referenztypen handelt. und CancellationTokenSource ist ein Referenztyp.

CancellationToken hat 2 Konstruktoren, die dieses Feld setzen, aber sie sind irrelevant, da default(CancellationToken) keine Konstruktoren aufruft und new CancellationToken() (die genau dasselbe Verhalten haben) keinen Konstruktor aufrufen, was becuase Strukturen nicht können haben parameterlose Konstruktoren ( noch ).

    
i3arnon 30.03.2015, 19:58
quelle

1 Antwort

11

default(CancellationToken) erstellt ein CancellationToken wobei m_source ist null . Sie können dies erkennen, indem Sie den Wert dieses privaten Felds mithilfe von reflection abrufen:

%Vor%

Ausgabe:

%Vor%

Sie können das auch sehen, indem Sie nur das relevante Feld im Debugger anzeigen:

Was passiert also?

Der Debugger greift, um den Inhalt von CancellationToken anzuzeigen, nacheinander auf seine Eigenschaften zu. Wenn die innere CancellationTokenSource null ist, erstellt und setzt die WaitHandle Eigenschaft eine Standard CancellationTokenSource , bevor sie an ihre WaitHandle Eigenschaft delegiert:

%Vor%

Zusammenfassend ergibt default(CancellationToken) und new CancellationToken eine leere Struktur, wobei m_source % null ist, aber Wenn Sie die Struktur im Debugger betrachten, füllen Sie dieses Feld aus mit einer standardmäßigen CancellationTokenSource -Instanz, die nicht abgebrochen werden kann.

    
i3arnon 30.03.2015, 19:58
quelle