破棄と破棄パターン

Tip

この記事は、少なくとも 1 つのプログラミング言語を既に知っており、C# を学習している開発者向けの 基礎 セクションの一部です。 パターンを初めて使用する場合は、 パターン マッチングの概要から始めます。 完全な構文については、 破棄パターンのリファレンスを参照してください

アンダースコア トークン (_) は、値が必要ないことを伝えます。 その正確な意味は、表示される場所によって異なります。

Context の意味 _
switch 式のアームまたは入れ子のパターン 結果をキャプチャせずに一致する破棄パターン
デコンストラクションまたは out 引数 生成された 1 つの値を無視する破棄
次のような割り当て _ = expression 式を評価し、その結果を無視する破棄代入
名前が付いた 2 つ以上のラムダ パラメーター _ 入力が使用されていないパラメーターを破棄する
パターン内の var _ 破棄指定を持つ var パターン

これらのフォームはスペルと意図を共有しますが、交換可能ではありません。

switch を使用したパターン マッチング

次の例の statusCodeint です。 各スイッチ・アームは、プログラムがコンソールに書き込む string ・メッセージを生成します。 最後の _ は、 200404以外のすべての状態コードを処理します。

static void ShowStatus()
{
    int statusCode = 503;
    string message = statusCode switch
    {
        200 => "Ready",
        404 => "Not found",
        _ => "Another status"
    };

    Console.WriteLine(message);
}

破棄パターンが入力式に適用されます。 C# は式を評価し、 _ はキャプチャせずに評価された値と一致します。 前に処理されていないすべての値が同じフォールバックを使用する必要がある場合は、最後の switch-expression arm として _ を選択します。 nullを含め、すべてに一致するため、最後に置きます。

フォーム var _ は、破棄指定を持つ var パターンです。 また、評価されたすべての値と一致しますが、読み取り可能な変数は導入されません。 スイッチキャッチオールの破棄パターン _ 短くすることをお選び下さい。 varパターンと指定の詳細については、「宣言、定数、およびvarパターン」を参照してください。

分解宣言

GetForecast は、4 つのコンポーネントを持つタプルを返します。 string 都市と、高温、低温、雨の可能性に関する 3 つの int 値です。 分解宣言では、 cityhigh が保持されます。これは、プログラムによって表示されるためです。 未使用のそれらのコンポーネントに名前を付けると、コードがそれらを必要としていることを示唆してしまうため、低温と降雨確率には _ を使っています。

static void ShowForecast()
{
    var (city, high, _, _) = GetForecast();
    Console.WriteLine($"{city}: high {high}°C");

    static (string City, int High, int Low, int RainChance) GetForecast() =>
        ("Portland", 18, 9, 40);
}

オブジェクトの Deconstruct メソッドが複数の値を生成する場合も、同じ破棄構文が機能します。 これらのフォームについては、「 タプルとその他の型の分解」を参照してください。

out パラメーターを持つメソッドの呼び出し

入力フィールドが整数を表す場合にのみテキストを受け入れるとします。 TryParse(String, Int32) メソッドは、解析が成功したかどうかを報告するboolを返します。 また、out パラメーターを使用して解析されたintも生成します。 次のコードでは、入力を受け入れるか拒否するためにブール値の結果のみが必要です。

static void CheckInput()
{
    string text = "42";

    if (IsWholeNumber(text))
    {
        Console.WriteLine($"Accepted: {text}");
    }
    else
    {
        Console.WriteLine("Enter a whole number.");
    }

    static bool IsWholeNumber(string text) => int.TryParse(text, out _);
}

操作の成功のみが重要な場合は、 out _ を使用します。 破棄により、解析された数値が必要ないことを明確に示します。 後のコードで番号が必要な場合は、 out 引数に名前 ( out int number など) を付け、代わりにその値を保持します。

破棄代入 _ = expression、式を評価し、その結果を意図的に無視します。 式がそれ単体では有効なステートメントにならない場合に、役立つことがあります。

Important

_ = Task.Run(...)_ = SomeAsyncMethod()を使用して、アプリケーション コード内のタスクを破棄しないでください。 タスクの完了と例外が呼び出しフローに残るようにタスクを待機します。 破棄割り当てでは、タスクを安全にしたり、例外を観察したり、サポートされているファイア アンド フォーゲット操作を作成したりすることはありません。

未使用のラムダ パラメーターをマークする

EventHandlerは、object?送信者とEventArgs値を受け取ります。 次のハンドラーでは、どちらのパラメーターも必要としていません。コンソールに書き込むのは "Timer tick" だけです。 両方のパラメーターを _ と命名すると、本体で使われない名前をわざわざ付けることなく、それらが未使用であることを明確にできます。

static void ShowLambdaDiscards()
{
    EventHandler handler = (_, _) => Console.WriteLine("Timer tick");
    handler(null, EventArgs.Empty);
}

デリゲートシグネチャにラムダ本体で使用されない入力が必要な場合は、破棄パラメーターを選択します。 ラムダに _ という名前のパラメーターが 1 つしかない場合、 _ は下位互換性のために通常のパラメーター名のままです。

識別子としての _ を避ける

_ は、C# が破棄を認識しないコンテキストの通常の識別子です。 _という名前のスコープ内変数は、破棄割り当てのような割り当てを受け取ることができます。 パターン コンテキストでは、 _ という名前のアクセス可能な定数または型によって、 _ の解釈方法も変更される可能性があります。 _という名前の独自の変数、定数、または型を宣言しないでください。破棄の意図を伝えるために_を使用します。

こちらも参照ください