Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

Использование модификатора params

В языке C# поддерживаются массивы параметров с использованием ключевого слова

params
, которое позволяет передавать методу переменное количество идентично типизированных параметров (или классов, связанных отношением наследования) в виде единственного логического параметра. Вдобавок аргументы, помеченные ключевым словом
params
, могут обрабатываться, когда вызывающий код передает строго типизированный массив или список элементов, разделенных запятыми. Да, это может сбивать
с толку! В целях прояснения предположим, что вы хотите создать функцию, которая позволяет вызывающему коду передавать любое количество аргументов и возвращает их среднее значение.

Если вы прототипируете данный метод так, чтобы он принимал массив значений

double
, тогда в вызывающем коде придется сначала определить массив, затем заполнить его значениями и, наконец, передать его методу. Однако если вы определите метод
CalculateAverage
как принимающий параметр
params
типа
double[]
, то вызывающий код может просто передавать список значений
double
, разделенных запятыми. "За кулисами" список значений
double
будет упакован в массив типа
double
.

// Возвращение среднего из некоторого количества значений double.

static double CalculateAverage(params double[] values)

{

Console.WriteLine("You sent me {0} doubles.", values.Length);

double sum = 0;

if(values.Length == 0)

{

return sum;

}

for (int i = 0; i < values.Length; i++)

{

sum += values[i];

}

return (sum / values.Length);

}

Метод

CalculateAverage
был определен для приема массива параметров типа
double
. Фактически он ожидает передачи любого количества (включая ноль) значений
double
и вычисляет их среднее. Метод может вызываться любым из показанных далее способов:

Console.WriteLine("***** Fun with Methods *****");

// Передать список значений double, разделенных запятыми...

double average;

average = CalculateAverage(4.0, 3.2, 5.7, 64.22, 87.2);

// Вывод среднего значения для переданных данных

Console.WriteLine("Average of data is: {0}", average);

// ...или передать массив значений double.

double[] data = { 4.0, 3.2, 5.7 };

average = CalculateAverage(data);

// Вывод среднего значения для переданных данных

Console.WriteLine("Average of data is: {0}", average);

//
Среднее из 0 равно 0!

// Вывод среднего значения для переданных данных

Console.WriteLine("Average of data is: {0}", CalculateAverage);

Console.ReadLine;

Если модификатор

params
в определении метода
CalculateAverage
не задействован, тогда его первый вызов приведет к ошибке на этапе компиляции, т.к. компилятору не удастся найти версию
CalculateAverage
, принимающую пять аргументов типа
double
.

На заметку! Во избежание любой неоднозначности язык C# требует, чтобы метод поддерживал только один параметр

params
, который должен быть последним в списке параметров.

Как и можно было догадаться, данный прием — всего лишь удобство для вызывающего кода, потому что .NET Core Runtime создает массив по мере необходимости. В момент, когда массив окажется внутри области видимости вызываемого метода, его можно трактовать как полноценный массив .NET Core, обладающий всей функциональностью базового библиотечного класса

System.Array
. Взгляните на вывод:

You sent me 5 doubles.

Average of data is: 32.864

You sent me 3 doubles.

Average of data is: 4.3

You sent me 0 doubles.

Average of data is: 0

Определение необязательных параметров

Язык C# дает возможность создавать методы, которые могут принимать необязательные аргументы. Такой прием позволяет вызывать метод, опуская ненужные аргументы, при условии, что подходят указанные для них стандартные значения.

Для иллюстрации работы с необязательными аргументами предположим, что имеется метод по имени

EnterLogData
с одним необязательным параметром:

static void EnterLogData(string message, string owner = "Programmer")

{

Console.Beep;

Console.WriteLine("Error: {0}", message); // Сведения об ошибке

Console.WriteLine("Owner of Error: {0}", owner); // Владелец ошибки

}

Здесь последнему аргументу

string
было присвоено стандартное значение
"Programmer"
через операцию присваивания внутри определения параметров. В результате метод
EnterLogData
можно вызывать двумя способами:

Console.WriteLine("***** Fun with Methods *****");

...

EnterLogData("Oh no! Grid can't find data");

EnterLogData("Oh no! I can't find the payroll data", "CFO");

Поделиться:
Популярные книги

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Ермак. Телохранитель

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Свет Черной Звезды

Звездная Елена
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Свет Черной Звезды

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад