11

デフォルトを作成すると、プライベートフィールドに保存されている が関連付けられていることCancellationTokenがデバッガで確認できます。CancellationTokenCancellationTokenSourcem_source

ヌルではない

構造体に関しては、defaultキーワードが「値型か参照型かに応じて、構造体の各メンバーをゼロまたはヌルに初期化して返す」ことがどのようになるのか疑問に思っていますCancellationTokenSource

CancellationTokenこのフィールドを設定する 2 つのコンストラクターがありますが、コンストラクターを呼び出さず、 (まったく同じ動作をする) 構造体がパラメーターなしのコンストラクターを持つことができないため (まだdefault(CancellationToken)) コンストラクターを呼び出さないため、これらは無関係です。new CancellationToken()

4

1 に答える 1

15

default(CancellationToken)CancellationTokenはwhere m_sourceisを作成しますnull。リフレクションを使用してそのプライベート フィールドの値を取得することで、それを確認できます。

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

出力:

null

また、デバッガーで関連するフィールドのみを固定することによっても確認できます。

ヌル

それで、何が起こるのですか?

デバッガは、 の内容を表示するために、CancellationTokenそのプロパティに 1 つずつアクセスします。内部CancellationTokenSourceがプロパティnullの場合、そのプロパティに委譲する前にWaitHandleデフォルトを作成および設定します。CancellationTokenSourceWaitHandle

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

        return m_source.WaitHandle;
    }
}

結論として、空の構造体default(CancellationToken)を作成しますが、デバッガーで構造体を見ると、そのフィールドにキャンセルできないデフォルトのインスタンスが入力されています。new CancellationTokenm_sourcenullCancellationTokenSource

于 2015-03-30T19:58:26.777 に答える