更新 : 2007 年 11 月
可変個のパラメータをメンバに渡すには配列を使用します。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);
}
次のガイドラインは、どのような場合にパラメータに可変個の配列を使用するのが適切かつ有効であるかを理解するうえで役立ちます。
エンド ユーザーによって渡される要素数が少ないと思われる場合は、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)
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)
' 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)
このパラメータは次のように並べ替える必要があります。
Overloads Public Function Add (numberBase as Int16, i as Integer,j as Integer) _
as Integer
public 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)
' 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)
パフォーマンスが優先課題となる 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
)
パラメータ配列の引数として null (Visual Basic では Nothing) を渡すことができることを確認します。
メンバでは、処理前に null 配列をチェックする必要があります。
varargs メソッド (省略記号とも呼ばれる) は使用しないでください。
varargs 呼び出し規約は CLS 準拠ではないため、パブリック メンバでは使用できません。ただし、内部では使用できます。
Portions Copyright 2005 Microsoft Corporation.All rights reserved.
Portions Copyright Addison-Wesley Corporation.All rights reserved.
デザイン ガイドラインの詳細については、2005 年に Addison-Wesley から出版されている Krzysztof Cwalina、Brad Abrams 共著の『Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries』を参照してください。