Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 86
- Предыдущая
- 86/642
- Следующая
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); // Время возникновения ошибки}Такой код не скомпилируется, поскольку значение свойства
NowDateTimeНа заметку! Во избежание неоднозначности необязательные параметры должны всегда помещаться в конец сигнатуры метода. Если необязательные параметры обнаруживаются перед обязательными, тогда компилятор сообщит об ошибке.
Использование именованных параметров (обновление в версии 7.2)
Еще одним полезным языковым средством C# является поддержка именованных аргументов. Именованные аргументы позволяют вызывать метод с указанием значений параметров в любом желаемом порядке. Таким образом, вместо передачи параметров исключительно по позициям (как делается в большинстве случаев) можно указывать имя каждого аргумента, двоеточие и конкретное значение. Чтобы продемонстрировать использование именованных аргументов, добавьте в класс
Programstatic 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()ConsoleColorstringDisplayFancyMessage()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 и последующих версиях именованные и позиционные аргументы можно смешивать, поступать так — не особо удачная идея. Возможность не значит обязательность!
Ниже приведен пример:
<b>// Все нормально, т.к. позиционные аргументы находятся перед именованными.</b>DisplayFancyMessage(ConsoleColor.Blue, message: "Testing...", backgroundColor: ConsoleColor.White);<b>// Все нормально, т.к. все аргументы располагаются в корректном порядке.</b>DisplayFancyMessage(textColor: ConsoleColor.White, backgroundColor:ConsoleColor.Blue, "Testing...");<b>// ОШИБКА в вызове, поскольку позиционные аргументы следуют после именованных.</b>DisplayFancyMessage(message: "Testing...", backgroundColor: ConsoleColor.White,- Предыдущая
- 86/642
- Следующая
