Во всех предыдущих примерах мы использовали постоянное число параметров. Но, используя ключевое слово params, мы можем передавать неопределенное количество параметров:
void Sum(params int[] numbers) { int result = 0; foreach (var n in numbers) { result += n; } Console.WriteLine(result); } int[] nums = { 1, 2, 3, 4, 5}; Sum(nums); Sum(1, 2, 3, 4); Sum(1, 2, 3); Sum();
Сам параметр с ключевым словом params при определении метода должен представлять одномерный массив того типа, данные которого мы собираемся использовать. При вызове метода на место параметра с модификатором params мы можем передать как отдельные значения, так и массив значений, либо вообще не передавать параметры. Количество передаваемых значений в метод неопределено, однако все эти значения должны соответствовать типу параметра с params.
Если же нам надо передать какие- то другие параметры, то они должны указываться до параметра с ключевм словом params:
void Sum(int initialValue, params int[] numbers) { int result = initialValue; foreach (var n in numbers) { result += n; } Console.WriteLine(result); } int[] nums = { 1, 2, 3, 4, 5}; Sum(10, nums); // число 10 - передается параметру initialValue Sum(1, 2, 3, 4); Sum(1, 2, 3); Sum(20);
Здесь метод Sum имеет обязательный параметр initialValue, поэтому при вызове метода для него нужно обязательно передать значение. Поэтому первое значение при вызове метода будет передаваться этому параметру.
Однако после параметра с модификатором params мы НЕ можем указывать другие параметры. То есть следующее определение метода недопустимо:
//Так НЕ работает void Sum(params int[] numbers, int initialValue) {}
Также этот способ передачи параметров надо отличать от передачи массива в качестве параметра:
void Sum(int[] numbers, int initialValue) { int result = initialValue; foreach (var n in numbers) { result += n; } Console.WriteLine(result); } int[] nums = { 1, 2, 3, 4, 5}; Sum(nums, 10); // Sum(1, 2, 3, 4); // так нельзя - нам надо передать массив
Так как метод Sum
принимает в качестве параметра массив без ключевого слова params
, то при его вызове нам обязательно надо передать в качестве первого параметра
массив. Кроме того, в отличие от метода с параметром params после параметра-массива могут располагаться другие параметры.