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

ЖАНРЫ

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

{

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");

Console.ReadLine;

Из-за того, что в первом вызове

EnterLogData
не был указан второй аргумент
string
, будет использоваться его стандартное значение —
"Programmer"
. Во втором вызове
EnterLogData
для второго аргумента передано значение
"CFO"
.

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

EnterLogData
, добавив к нему дополнительный необязательный параметр:

// Ошибка! Стандартное значение для необязательного

// аргумента должно быть известно на этапе компиляции!

static void EnterLogData(string message,

string owner = "Programmer", DateTime timeStamp =
DateTime.Now)

{

Console.Beep;

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

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

Console.WriteLine("Time of Error: {0}", timeStamp);

// Время возникновения ошибки

}

Такой код не скомпилируется, поскольку значение свойства

Now
класса
DateTime
вычисляется во время выполнения, а не на этапе компиляции.

На заметку! Во избежание неоднозначности необязательные параметры должны всегда помещаться в конец сигнатуры метода. Если необязательные параметры обнаруживаются перед обязательными, тогда компилятор сообщит об ошибке.

Использование именованных параметров (обновление в версии 7.2)

Еще одним полезным языковым средством C# является поддержка именованных аргументов. Именованные аргументы позволяют вызывать метод с указанием значений параметров в любом желаемом порядке. Таким образом, вместо передачи параметров исключительно по позициям (как делается в большинстве случаев) можно указывать имя каждого аргумента, двоеточие и конкретное значение. Чтобы продемонстрировать использование именованных аргументов, добавьте в класс

Program
следующий метод:

Поделиться с друзьями: