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

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

Жанры

Язык программирования 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);

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

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

Мимик нового Мира 10

Северный Лис
9. Мимик!
Фантастика:
юмористическое фэнтези
альтернативная история
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 10

Польская партия

Ланцов Михаил Алексеевич
3. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Польская партия

Здравствуй, 1984-й

Иванов Дмитрий
1. Девяностые
Фантастика:
альтернативная история
6.42
рейтинг книги
Здравствуй, 1984-й

Темный Лекарь 3

Токсик Саша
3. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 3

Назад в СССР: 1986 Книга 5

Гаусс Максим
5. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Назад в СССР: 1986 Книга 5

Наследница Драконов

Суббота Светлана
2. Наследница Драконов
Любовные романы:
современные любовные романы
любовно-фантастические романы
6.81
рейтинг книги
Наследница Драконов

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Не кровный Брат

Безрукова Елена
Любовные романы:
эро литература
6.83
рейтинг книги
Не кровный Брат

Ты нас предал

Безрукова Елена
1. Измены. Кантемировы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты нас предал

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл