Tip
この記事は、少なくとも 1 つのプログラミング言語を既に知っており、C# を学習している開発者向けの 基礎 セクションの一部です。 パターンを初めて使用する場合は、 パターン マッチングの概要から始めます。 完全な構文については、 破棄パターンのリファレンスを参照してください。
アンダースコア トークン (_) は、値が必要ないことを伝えます。 その正確な意味は、表示される場所によって異なります。
| Context | の意味 _ |
|---|---|
| switch 式のアームまたは入れ子のパターン | 結果をキャプチャせずに一致する破棄パターン |
デコンストラクションまたは out 引数 |
生成された 1 つの値を無視する破棄 |
次のような割り当て _ = expression |
式を評価し、その結果を無視する破棄代入 |
名前が付いた 2 つ以上のラムダ パラメーター _ |
入力が使用されていないパラメーターを破棄する |
パターン内の var _ |
破棄指定を持つ var パターン |
これらのフォームはスペルと意図を共有しますが、交換可能ではありません。
switch を使用したパターン マッチング
次の例の statusCode は int です。 各スイッチ・アームは、プログラムがコンソールに書き込む string ・メッセージを生成します。 最後の _ は、 200 と 404以外のすべての状態コードを処理します。
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 値です。 分解宣言では、 city と high が保持されます。これは、プログラムによって表示されるためです。 未使用のそれらのコンポーネントに名前を付けると、コードがそれらを必要としていることを示唆してしまうため、低温と降雨確率には _ を使っています。
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# が破棄を認識しないコンテキストの通常の識別子です。
_という名前のスコープ内変数は、破棄割り当てのような割り当てを受け取ることができます。 パターン コンテキストでは、 _ という名前のアクセス可能な定数または型によって、 _ の解釈方法も変更される可能性があります。
_という名前の独自の変数、定数、または型を宣言しないでください。破棄の意図を伝えるために_を使用します。
こちらも参照ください
.NET