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 ).
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:
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:
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.
Tags und Links .net c# cancellationtokensource cancellation-token