Поделиться через


Члены с переменным количеством параметров

Обновлен: Ноябрь 2007

Массивы используются для передачи переменного количества параметров члену. В некоторых языках, таких как 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);
}

Следующие рекомендации помогут понять, когда целесообразно и выгодно использовать массивы с переменным числом параметров.

Рекомендуется добавлять ключевое слово "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) 
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" ("Nothing" в Visual Basic) может быть передан в качестве аргумента массива "params".

Перед обработкой массива член должен проверять, не является ли он null-массивом.

Не используйте методы "varargs", известные также под названием "многоточие".

Вследствие того, что соглашение о вызове varargs несовместимо со спецификацией CLS, его не следует использовать в открытых членах. Его можно использовать внутри кода.

Фрагменты — © Корпорация Майкрософт (Microsoft Corp.), 2005. Все права защищены.

Фрагменты — © Addison-Wesley Corporation. Все права защищены.

Дополнительные сведения о рекомендациях по разработке см. в книге "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries", Krzysztof Cwalina and Brad Abrams, Addison-Wesley, 2005.

См. также

Основные понятия

Разработка параметров

Другие ресурсы

Правила разработки членов

Руководство по разработке библиотек классов