なぜMax(1,2,3)で動くの?C#のparamsの正体

params は必要? ― 可変長引数の正体を理解する

C#で次のようなメソッドを見たことはないでしょうか。

int Max(params int[] numbers)
{
    if (numbers.Length == 0)
    {
        throw new ArgumentException("配列が空です。");
    }
    int max = numbers[0];
    foreach (var number in numbers)
    {
        if (number > max)
        {
            max = number;
        }
    }
    return max;
}

このとき、初学者がよく疑問に思うのが、

「引数の params って、必要なんですか?」

という点です。


結論:params は必須ではない

結論から言うと、

params は なくても動くただし 付けると呼び出し方が変わる

というのが答えです。


params を付けた場合

int Max(params int[] numbers)

このメソッドは、次の2通りの呼び出し方ができます。

Max(1, 5, 3, 9);            // 個別に渡せる
Max(new int[] {1,5,3,9});  // 配列として渡せる

実際には、コンパイラが裏でこう変換しています。

Max(new int[] { 1, 5, 3, 9 });

つまり params は、

「複数の引数を、自動的に配列にまとめてくれる仕組み」

です。

これを 可変長引数(variable arguments) と呼びます。


params を付けない場合

int Max(int[] numbers)

この場合、呼び出し方はこうなります。

Max(new int[] {1,5,3,9});  // OK
Max(1, 5, 3, 9);          // コンパイルエラー

必ず「配列として」渡さなければなりません。


本質:params は文法糖衣

ここが一番大事なポイントです。

params を付けても付けなくても、

  • メソッドの中身
  • アルゴリズム
  • 実行結果

は 一切変わりません

違うのは、

「呼び出し側の書きやすさ」だけ

です。

このような仕組みを 文法糖衣(シンタックスシュガー) と呼びます。

中身は同じだが、見た目を甘く(書きやすく)しているだけ、という意味です。


教育的な使い分け初学者向け教材なら

int Max(int[] numbers)

理由:

  • 配列の概念をそのまま理解できる
  • 「配列を受け取って処理する」という構造が見える
  • 特殊構文を増やさずに済む

実務・ライブラリなら

int Max(params int[] numbers)

理由:

  • 呼び出しが圧倒的に楽
  • Max(1,2,3,4) と自然に書ける
  • 標準ライブラリもこの設計が多い

試験・知識問題でよく出るポイント

よくある正誤問題:

params を付けたメソッドは、配列としても、個別引数としても呼び出せる。

→ 正しい


まとめ

観点params なしparams あり
配列理解
呼び出しやすさ
アルゴリズム同じ同じ
本質配列配列(見た目だけ違う)

一言で言うと

params とは、

「配列を受け取るメソッドを、「配列を受け取るメソッドを、複数引数でも呼べるようにしただけの便利構文」

です。

ロジックを学ぶ段階では不要。

道具として使う段階で価値が出る。

まさに「後で知るとありがたいC#機能」の代表例です。

訪問数 3 回, 今日の訪問数 3回

C#

Posted by hidepon