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 следующий метод:
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() допустимо вызывать и так, как показано ниже: