++C++; // 未確認飛行 C

Google
Web ufcpp.net

可変長引数

目次

キーワード

概要

C# では params キーワードを用いることでメソッドの引数の数を可変にすることが出来ます。

params キーワード

例えば、可変個の整数のうち最大の整数を求めるメソッドを作りたいとします。 可変長引数を使わずにメソッドを実装すると以下のようになるでしょう。

using System;

class ParamsTest
{
  static void Main()
  {
    int a = 314, b = 159, c = 265, d = 358, e  = 979;
    // ↑こいつらの最大値を探したいとき、

    int[] tmp = new int[]{a, b, c, d, e};
    // ↑こんな風に一度配列に格納してから

    int max = Max(tmp);
    // ↑Max メソッドを呼び出す必要がある。

    Console.Write("{0}\n", max);
  }

  static int Max(int[] a)
  {
    int max = a[0];
    for(int i=1; i<a.Length; ++i)
    {
      if(max < a[i])
        max = a[i];
    }
    return max;
  }
}

この方法では、1度値を配列に格納してからメソッドを呼び出すという操作が必要になります。 このメソッドを呼び出すたびに1時的に配列を作成して、 値を格納してという作業を行うのは面倒です。 そこで、この作業を自動化しようというのが C# の可変長引数の考え方です。

C# では params というキーワードを使って可変個の引数を取るメソッドを定義することが出来ます。 例えば、上の例を params キーワードを使って書き直すと以下のようになります。

using System;

class ParamsTest
{
  static void Main()
  {
    int a = 314, b = 159, c = 265, d = 358, e  = 979;
    // ↑こいつらの最大値を探したいとき、

    int max = Max(a, b, c, d, e);
    // ↑こうすると、自動的に配列を作って値を格納してくれる。

    Console.Write("{0}\n", max);
  }

  static int Max(params int[] a)
  {
    int max = a[0];
    for(int i=1; i<a.Length; ++i)
    {
      if(max < a[i])
        max = a[i];
    }
    return max;
  }
}

メソッド定義側の変更点は引数 int[] a の前に params キーワードが付いただけです。 呼び出し側では、手動で配列を用意して値を格納しなくても、 可変個の引数を与えてメソッドを呼び出すことが出来ます。

サンプル

今まで何気なく Console.Write("(x, y) = ({0}, {1})\n", x, y) というような書き方をしていましたが、この Console.Write メソッドは可変長引数の機構を使っています。

ここでは、params の例として、 かなり簡略化したものですが、Console.Write もどきを作ってみます。

using System;

class TestParams
{
  static void Main(string[] args)
  {
    double x = 3.14;
    int    n = 99;
    string s = "test string";
    bool   b = true;

    Write("x = {0}, n = {1}, s = {2}, b = {3}\n", x, n, s, b);
  }

  /// <summary>
  /// Console.Write もどき。
  /// {0:d5} のような書式指定は出来ません。
  /// </summary>
  /// <param name="format">書式指定文字列</param>
  /// <param name="args">format を使用して書き込むオブジェクトの配列</param>
  static void Write(string format, params object[] args)
  {
    for(int i=0; i<args.Length; ++i)
    {
      format = format.Replace("{" + i.ToString() + "}", args[i].ToString());
    }
    Console.Write(format);
  }
}
x = 3.14, n = 99, s = test string, b = True
Transtation into English

[お問い合わせ](q)