C# ラムダ式の破棄パラメータ

C# 9.0 以降では、ラムダ式のパラメータとして破棄パラメータ(discard parameter)を使用できます。使わない引数を明示的に無視することで、コードの意図が明確になります。

破棄パラメータとは

破棄パラメータは _(アンダースコア)で表記します。「この引数は受け取るが、使用しない」という意図を示します。

// 第2引数は使わないことを明示
Func<int, int, int> ignoreSecond = (x, _) => x * 2;

Console.WriteLine(ignoreSecond(5, 100)); // 10

イベントハンドラでの活用

イベントハンドラでは、senderEventArgs を使わないケースが多くあります。破棄パラメータで意図を明示できます。

button.Click += (_, _) => Console.WriteLine("クリックされました");

両方の引数を使わないため、両方とも _ で破棄しています。

従来の書き方との比較

破棄パラメータがなかった時代は、未使用の引数にも名前を付ける必要がありました。

従来の書き方

未使用でも sendere などの名前を付けていた。使わない変数に警告が出ることも。

破棄パラメータ

_ で「使わない」ことを明示。コードの意図が明確。

// 従来の書き方
button.Click += (sender, e) => Console.WriteLine("クリック");

// 破棄パラメータを使用
button.Click += (_, _) => Console.WriteLine("クリック");

LINQ での使用例

インデックス付きの Select オーバーロードで、インデックスを使わない場合などに便利です。

var items = new[] { "A", "B", "C" };

// インデックス付き Select だが、インデックスは使わない
var result = items.Select((item, _) => item.ToLower());

複数の破棄パラメータ

同じラムダ式内で複数の _ を使用できます。

// 3つの引数のうち、最初の1つだけ使用
Func<int, int, int, int> useOnlyFirst = (x, _, _) => x * 10;

Console.WriteLine(useOnlyFirst(5, 100, 200)); // 50

注意点

C# 8.0 以前では、_ は通常の変数名として扱われていました。そのため、同じスコープで複数の _ を使うとエラーになります。C# 9.0 以降を使用している必要があります。

// C# 9.0 以降でのみ有効
Action<int, int> action = (_, _) => Console.WriteLine("両方破棄");

破棄パラメータは小さな機能ですが、「この引数は意図的に無視している」ことを明示できる点で、コードの可読性向上に貢献します。