省略可能パラメータと名前付き引数
メソッド呼び出しでは、毎回すべての引数を同じ形で書く必要はありません。省略可能パラメータと名前付き引数を使うと、呼び出し方を柔軟にできます。
学習目標
- 省略可能パラメータの定義と制約を説明できる
- 名前付き引数で順番を入れ替えられることを理解できる
- 省略可能パラメータが末尾に置かなければならない理由を説明できる
前提知識
1. 省略可能パラメータ
省略可能パラメータは、デフォルト値を持つパラメータです。呼び出し側はその引数を省略できます。
書式:省略可能パラメータ
1
2
3
4
| 戻り値の型 メソッド名(型 必須引数, 型 引数名 = デフォルト値)
{
処理
}
|
| 要素 |
説明 |
必須引数 |
呼び出し時に必ず渡す引数 |
引数名 |
省略可能にする引数 |
= |
デフォルト値を設定する記号 |
デフォルト値 |
省略時に自動で使われる値 |
1
2
3
4
5
6
7
8
9
10
11
| class A
{
public void M(int x, int y = 0)
{
Console.WriteLine($"A.M: x={x}, y={y}");
}
}
var a = new A();
a.M(1);
a.M(1, 2);
|
1
2
| A.M: x=1, y=0
A.M: x=1, y=2
|
省略可能パラメータは、必ずパラメータリストの末尾に置きます。途中に置くと、どの引数を省略したのか判定できなくなるからです。
2. 名前付き引数
名前付き引数は、どのパラメータにどの値を渡すかを明示する書き方です。
書式:名前付き引数
1
2
| メソッド名(引数名: 値)
メソッド名(引数名1: 値1, 引数名2: 値2)
|
| 要素 |
説明 |
引数名 |
メソッド定義側のパラメータ名 |
: |
名前と値を結びつける記号 |
値 |
実際に渡す値 |
名前付き引数を使うと、順番を入れ替えて書けます。
1
2
3
4
5
6
7
8
9
10
11
| class A
{
public void M(int x, int y = 0)
{
Console.WriteLine($"A.M: x={x}, y={y}");
}
}
var a = new A();
a.M(y: 5, x: 1);
a.M(x: 1);
|
1
2
| A.M: x=1, y=5
A.M: x=1, y=0
|
一部だけ名前付きにすることもできます。ただし、必須の引数は省略できません。たとえば void M(int x = 0, int y = 0) のように両方が省略可能なら M(y: 5) と書けます。
3. params
params の詳細な説明と動作については params キーワード を参照してください。
4. 省略可能パラメータと名前付き引数をまとめて確認する
1
2
3
4
5
6
7
8
9
10
11
12
| class A
{
public void M(int x, int y = 0)
{
Console.WriteLine($"A.M: x={x}, y={y}");
}
}
var a = new A();
a.M(1); // y は省略 → y=0
a.M(1, 2);
a.M(y: 5, x: 1); // 名前付き引数
|
1
2
3
| A.M: x=1, y=0
A.M: x=1, y=2
A.M: x=1, y=5
|
よくあるミス
ミス①:省略可能パラメータを必須パラメータより前に置く
1
2
3
4
5
| // ❌ NG: 省略可能パラメータの後ろに必須パラメータを置けない
// void M(int x = 0, int y) { }
// ✅ OK: 省略可能パラメータは末尾に置く
void M(int x, int y = 0) { Console.WriteLine($"A.M: x={x}, y={y}"); }
|
まとめ
- 省略可能パラメータはデフォルト値を持ち、呼び出し時に省略できる
- 省略可能パラメータは必ずパラメータリストの末尾に置く
- 名前付き引数を使うと、引数名を明示して順番を入れ替えられる
理解度チェック
以下の問いに答えられるか確認しましょう。
- 省略可能パラメータが末尾に置かなければならないのはなぜですか?
-
次のコードの出力結果は何になりますか?
1
2
3
4
5
6
7
8
9
10
11
| class A
{
public void M(int x, int y = 10)
{
Console.WriteLine($"A.M: x={x}, y={y}");
}
}
var a = new A();
a.M(y: 3, x: 1);
a.M(5);
|
解答を見る
- 呼び出し側の引数をどのパラメータに割り当てるかを曖昧にしないためです。
-
1
2
| A.M: x=1, y=3
A.M: x=5, y=10
|
次のステップ
params キーワード では、params の動作とコンパイラの変換、制約を詳しく学びます。