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

ЖАНРЫ

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

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);

Даже

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

Как выясняется, при наличии метода, в котором определены необязательные аргументы, данное средство может оказаться по-настоящему полезным. Предположим, что метод

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

static void DisplayFancyMessage(ConsoleColor textColor = ConsoleColor.Blue,

ConsoleColor backgroundColor = ConsoleColor.White,

string message = "Test Message")

{

...

}

Учитывая, что каждый аргумент имеет стандартное значение, именованные аргументы позволяют указывать в вызывающем коде только те параметры, которые не должны принимать стандартные значения. Следовательно, если нужно, чтобы значение

"Hello!"
появлялось в виде текста синего цвета на белом фоне, то в вызывающем коде можно просто записать так:

DisplayFancyMessage(message: "Hello!");

Если же необходимо, чтобы строка

"Test Message"
выводилась синим цветом на зеленом фоне, тогда должен применяться такой вызов:

DisplayFancyMessage(backgroundColor: ConsoleColor.Green);

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

Понятие перегрузки методов

Подобно другим современным языкам объектно-ориентированного программирования в C# разрешена перегрузка методов. Выражаясь просто, когда определяется набор идентично именованных методов, которые отличаются друг от друга количеством (или типами) параметров, то говорят, что такой метод был перегружен.

Чтобы оценить удобство перегрузки методов, давайте представим себя на месте разработчика, использующего Visual Basic 6.0 (VB6). Предположим, что на языке VB6 создается набор методов, возвращающих сумму значений разнообразных типов (

Integer
,
Double
и т.д.). С учетом того, что VB6 не поддерживает перегрузку методов, придется определить уникальный набор методов, каждый из которых будет делать по существу одно и то же (возвращать сумму значений аргументов):

' Примеры кода VB6.

Public Function AddInts(ByVal x As Integer, ByVal y As Integer) As Integer

AddInts = x + y

End Function

Public Function AddDoubles(ByVal x As Double, ByVal y As Double) As Double

AddDoubles = x + y

End Function

Public Function AddLongs(ByVal x As Long, ByVal y As Long) As Long

Поделиться с друзьями: