可変個のパラメーターを持つメンバー

可変個のパラメーターをメンバーに渡すには配列を使用します。 C# など一部の言語には、可変個の引数を渡すために使用する配列を装飾するためのキーワードが用意されています。 キーワードが用意されていない言語では、ParamArrayAttribute 属性によってこの機能が提供されます。 このキーワードや属性は、メンバーのシグネチャの最後のパラメーターに影響を与えます。 このパラメーターは 1 次元配列にする必要があります。

可変個のパラメーターを受け取るメソッドを定義して呼び出すコード例を次に示します。 DemonstrateVariableParameters メソッドでは、UseVariableParameters の呼び出し前に引数が配列に配置されないことに注意してください。


Public Shared Sub UseVariableParameters(ParamArray list() as  Integer) 
     For  i as Integer = 0  to list.Length -1 
        Console.WriteLine(list(i))
     Next i 
     Console.WriteLine()
End Sub

Public Shared Sub DemonstrateVariableParameters()

    Manager.UseVariableParameters(1,2,3,4,5)
End Sub


public static void UseVariableParameters(params int[] list) 
{
     for ( int i = 0 ; i < list.Length ; i++ )
     {
        Console.WriteLine(list[i]);
     }
     Console.WriteLine();
}

public static void DemonstrateVariableParameters()
{
    Manager.UseVariableParameters(1,2,3,4,5);
}

static void UseVariableParameters(... array<int>^ list)
{
    for ( int i = 0 ; i < list->Length ; i++ )
    {
        Console::WriteLine(list[i]);
    }
    Console::WriteLine();
}

static void DemonstrateVariableParameters()
{
    Manager::UseVariableParameters(1,2,3,4,5);
}

次のガイドラインは、どのような場合にパラメーターに可変個の配列を使用するのが適切かつ有効であるかを理解するうえで役立ちます。

エンド ユーザーによって渡される要素数が少ないと思われる場合は、params キーワードを配列パラメーターに追加することを検討してください。

通常、開発者が多くの要素を渡すと思われる場合、多数のオブジェクトをインラインで渡す可能性は低いため、params キーワードの有効性は低くなります。

呼び出し元の配列がほとんど常に入力済みになっているような場合は、params パラメーターを使用しないでください。

たとえば、通常、バイト データはバイト配列に格納して操作します。 params キーワードをバイト配列パラメーターに追加しても一般的なシナリオには対応できません。普通、開発者は、バイト配列にまだ格納されていない個々のバイトは処理しないからです。

params 配列パラメーターを受け取るメンバーによって配列が変更される場合、params 配列は使用しないでください。

共通言語ランタイム (CLR: Common Language Runtime) によって一時配列オブジェクトが作成されている場合があります。 メソッドによって一時配列が変更されると、呼び出し元ではその変更内容を使用できません。

複雑なオーバーロードで params キーワードを利用できない場合でも、単純なオーバーロードでは使用を検討してください。

1 つのオーバーロードで params 配列を使用しても有効な場合があります。必ずしもすべてのオーバーロードで使用する必要はありません。

params キーワードを使用できるようにパラメーターを並べないでください。

そのように並べると、配列パラメーターを、最後のパラメーターとして指定する必要があります。 不適切なパラメーターの順序を次のコード例に示します。

Overloads Public Function Add (i as Integer,j as Integer, numberBase as Int16) _
    as Integer
public int Add (int i,int j, short numberBase) 
int Add (int i,int j, short numberBase)
Overloads Public Function Add (i as Integer, j as Integer, k as Integer, _
    numberBase as int16) as Integer
public int Add (int i, int j, int k, short numberBase) 
int Add (int i, int j, int k, short numberBase)
' Can't use params array.
Overloads Public Function Add (numbers() as Integer, numberBase as Int16) _
    as Integer
// Can't use params array.
public int Add (int [] numbers, short numberBase) 
// Can't use params array.
int Add (array<int>^ numbers, short numberBase)

このパラメーターは次のように並べ替える必要があります。

Overloads Public Function Add (numberBase as Int16, i as Integer,j as Integer) _
    as Integer
public int Add (short numberBase, int i,int j)
int Add (short numberBase, int i,int j)
Overloads Public Function Add (numberBase as Int16, i as Integer, _
    j as Integer, k as Integer) as Integer
public int Add (short numberBase, int i, int j, int k) 
int Add (short numberBase, int i, int j, int k)
' Can use params array.
Overloads Public Function Add (numberBase as Int16, _
    ParamArray numbers() as Integer) as Integer
// Can use params array.
public int Add (short numberBase, params int [] numbers) 
// Can use params array.
int Add (short numberBase, ... array<int>^ numbers)

パフォーマンスが優先課題となる API では、少数の引数による呼び出しに対して特別なオーバーロードとコード パスを提供することを検討します。

このガイドラインに従うと、少数の引数を使用してメンバーを呼び出す場合に配列を作成せずに済みます。 パラメーターの名前は、単数形の配列パラメーターの後に数値サフィックスを指定したものを使用します。 このガイドラインに従ったメンバー シグネチャを次のコード例に示します。

Public Shared Sub WriteLine( _
     format as String,  _
     arg0 as Object, _
     arg1 as Object, _
     arg2 as Object _
)
public static void WriteLine(
    string format, 
    object arg0, 
    object arg1, 
    object arg2
)
static void WriteLine(
    String^ format,
    Object^ arg0,
    Object^ arg1,
    Object^ arg2
)

パラメーター配列の引数として null (Visual Basic では Nothing) を渡すことができることを確認します。

メンバーでは、処理前に null 配列をチェックする必要があります。

varargs メソッド (省略記号とも呼ばれる) は使用しないでください。

varargs 呼び出し規約は CLS 準拠ではないため、パブリック メンバーでは使用できません。 ただし、内部では使用できます。

Portions Copyright 2005 Microsoft Corporation. All rights reserved.

Portions Copyright Addison-Wesley Corporation. All rights reserved.

設計ガイドラインの詳細についてを参照してください、「フレームワークの設計ガイドライン。規則、慣用句、および再利用可能なパターン。ネット ライブラリ」本クシシュトフ Cwalina、ブラッド エイブラムス、アスキー、2005 年発表しました。

参照

概念

パラメーターのデザイン

その他の技術情報

メンバーのデザインのガイドライン

クラス ライブラリ開発のデザイン ガイドライン