C# 4.0 で導入された Named Arguments(名前付き引数) を使うと、メソッド呼び出し時に パラメータ名: 値 の形式で引数を渡せます。引数の順番に縛られないため、複数の引数を持つメソッドの呼び出しが読みやすくなります。
基本構文
void PrintInfo(string name, int age, string city)
{
Console.WriteLine($"{name}, {age}歳, {city}");
}
// 通常の呼び出し(位置で引数を対応付ける)
PrintInfo("Alice", 30, "Tokyo");
// Named Arguments を使った呼び出し
PrintInfo(name: "Alice", age: 30, city: "Tokyo");
パラメータ名: を付けるだけで、引数がどの項目に対応するかが一目でわかります。
順番を変えて呼び出す
Named Arguments の最大のメリットは、引数の順番を自由に変えられる点です。
// 順番を入れ替えても OK
PrintInfo(city: "Tokyo", name: "Alice", age: 30);
PrintInfo(age: 30, city: "Tokyo", name: "Alice");
どちらも name: "Alice", age: 30, city: "Tokyo" と同じ結果になります。
位置引数と Named Arguments の混在
Named Arguments は位置引数(名前なし)と混在させることもできます。ただし、位置引数は Named Arguments より前に置く必要があります。
// OK — 先頭から位置引数、残りを Named Arguments
PrintInfo("Alice", age: 30, city: "Tokyo");
// OK — 途中から Named Arguments
PrintInfo("Alice", 30, city: "Tokyo");
// NG — 位置引数が Named Arguments の後に来ている
// PrintInfo(name: "Alice", 30, city: "Tokyo"); // コンパイルエラー
C# 7.2 以降では、Named Arguments の後に位置引数を置けるケースが緩和されました。ただし、Named Arguments で順番を変えた引数よりも後にある位置引数には適用できません。
Optional Arguments(省略可能な引数)との組み合わせ
Named Arguments は、デフォルト値を持つ Optional Arguments(省略可能な引数) と組み合わせると特に威力を発揮します。
void CreateUser(
string name,
int age = 0,
string role = "user",
bool isActive = true)
{
Console.WriteLine($"{name}, {age}歳, {role}, active={isActive}");
}
// 全引数を位置で渡す場合、途中だけ変えたいときは冗長になる
CreateUser("Alice", 0, "admin", true);
// Named Arguments なら必要な引数だけ指定できる
CreateUser("Alice", role: "admin");
省略した age は 0、isActive は true がそれぞれデフォルト値として使われます。
可読性の向上
bool や数値リテラルを並べる呼び出しは、Named Arguments なしでは意味が掴みにくくなりがちです。
// 何の引数か分かりにくい
SendEmail("alice@example.com", true, false, 3);
// Named Arguments で意図が明確になる
SendEmail(
to: "alice@example.com",
includeAttachment: true,
sendCopy: false,
retryCount: 3);
オーバーロードとの関係
Named Arguments はオーバーロードの解決にも影響します。コンパイラは Named Arguments のパラメータ名も含めてオーバーロードを選択します。パラメータ名が異なれば別のオーバーロードが選ばれることはありませんが、同じ名前のパラメータを持つメソッドが複数ある場合はコンパイルエラーになります。
まとめ
| 特徴 | 説明 |
|---|---|
| 導入バージョン | C# 4.0 |
| 構文 | パラメータ名: 値 |
| 引数の順番 | 自由に変えられる |
| 位置引数との混在 | 可(位置引数が先) |
| Optional Arguments との組み合わせ | 任意の引数だけ指定できる |
Named Arguments は引数が多いメソッドや bool リテラルを多用するメソッドで特に有効です。Optional Arguments と組み合わせて、呼び出し側のコードをシンプルかつ意図が伝わりやすい形に整えましょう。