参数数目可变的成员

数组用于将数目可变的参数传递给成员。 某些语言(如 C#)提供了一个关键字,用于修饰传递可变参数的数组。 对于不提供关键字的语言,ParamArrayAttribute 特性可提供此功能。 该关键字和特性影响成员签名的最后一个参数。 该参数必须是一维数组。

下面的代码示例演示定义和调用参数数目可变的方法。 注意,在 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) 可能已创建了一个临时数组对象。 如果方法修改临时数组,则这些修改对调用方是不可用的。

考虑在简单重载中使用 params 关键字,即使更复杂的重载不能使用它。

在某个重载(即使不是所有重载)中使用 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)可以作为 params 数组参数进行传递。

在处理 null 数组之前,成员应对其进行检查。

不要使用 varargs 方法,这种方法以省略号的形式表示。

因为 varargs 调用约定不符合 CLS,所以不应在公共成员中使用。 它可以在内部使用。

部分版权所有 2005 Microsoft Corporation。 保留所有权利。

部分版权所有 Addison-Wesley Corporation。 保留所有权利。

设计指引的详细信息,请参阅"框架设计准则: 公约、 成语和可重复使用的模式。网络图书馆"书 Krzysztof Cwalina 和布拉德 · 艾布拉姆斯,2005年艾迪生 - 韦斯利,发表。

请参见

概念

参数设计

其他资源

成员设计准则

类库开发的设计准则