Язык программирования C#9 и платформа .NET5
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# является поддержка именованных аргументов. Именованные аргументы позволяют вызывать метод с указанием значений параметров в любом желаемом порядке. Таким образом, вместо передачи параметров исключительно по позициям (как делается в большинстве случаев) можно указывать имя каждого аргумента, двоеточие и конкретное значение. Чтобы продемонстрировать использование именованных аргументов, добавьте в класс
следующий метод: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(), за которыми следует переменная типа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 и последующих версиях именованные и позиционные аргументы можно смешивать, поступать так — не особо удачная идея. Возможность не значит обязательность!
Ниже приведен пример:
<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,