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

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

Жанры

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

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
следующий метод:

static void DisplayFancyMessage(ConsoleColor textColor,

ConsoleColor backgroundColor, string message)

{

//Сохранить старые цвета для их восстановления после вывода сообщения.

ConsoleColor oldTextColor = Console.ForegroundColor;

ConsoleColor oldbackgroundColor = Console.BackgroundColor;

// Установить новые цвета и вывести сообщение.

Console.ForegroundColor = textColor;

Console.BackgroundColor = backgroundColor;

Console.WriteLine(message);

//
Восстановить предыдущие цвета.

Console.ForegroundColor = oldTextColor;

Console.BackgroundColor = oldbackgroundColor;

}

Теперь, когда метод

DisplayFancyMessage
написан, можно было бы ожидать, что при его вызове будут передаваться две переменные типа
ConsoleColor
, за которыми следует переменная типа
string
. Однако с помощью именованных аргументов метод
DisplayFancyMessage
допустимо вызывать и так, как показано ниже:

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

DisplayFancyMessage(message: "Wow! Very Fancy indeed!",

textColor: ConsoleColor.DarkRed,

backgroundColor: ConsoleColor.White);

DisplayFancyMessage(backgroundColor: ConsoleColor.Green,

message: "Testing...",

textColor: ConsoleColor.DarkBlue);

Console.ReadLine;

В версии C# 7.2 правила применения именованных аргументов слегка изменились. До выхода C# 7.2 при вызове метода позиционные параметры должны были располагаться перед любыми именованными параметрами. В C# 7.2 и последующих версиях именованные и неименованные параметры можно смешивать, если параметры находятся в корректных позициях.

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

Ниже приведен пример:

// Все нормально, т.к. позиционные аргументы находятся перед именованными.

DisplayFancyMessage(ConsoleColor.Blue,

message: "Testing...",

backgroundColor: ConsoleColor.White);

// Все нормально, т.к. все аргументы располагаются в корректном порядке.

DisplayFancyMessage(textColor: ConsoleColor.White,

backgroundColor:ConsoleColor.Blue,

"Testing...");

// ОШИБКА в вызове, поскольку позиционные аргументы следуют после именованных.

DisplayFancyMessage(message: "Testing...",

backgroundColor: ConsoleColor.White,

ConsoleColor.Blue);

Даже если оставить в стороне указанное ограничение, то все равно может возникать вопрос: при каких условиях вообще требуется такая языковая конструкция? В конце концов, для чего нужно менять позиции аргументов метода?

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

Отмороженный 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
рейтинг книги
Сводный гад