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 не поддерживает перегрузку методов, придется определить уникальный набор методов, каждый из которых будет делать по существу одно и то же (возвращать сумму значений аргументов):
<b>' Примеры кода VB6.</b>
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
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})
AddLongs = x + y
End Function
Такой код не только становится трудным в сопровождении, но и заставляет помнить имена всех методов. Применяя перегрузку, вызывающему коду можно предоставить возможность обращения к единственному методу по имени Add(). Ключевой аспект в том, чтобы обеспечить для каждой версии метода отличающийся набор аргументов (различий только в возвращаемом типе не достаточно).
На заметку! Как будет объясняться в главе 10, существует возможность построения обобщенных методов, которые переносят концепцию перегрузки на новый уровень. Используя обобщения, можно определять заполнители типов для реализации метода, которая указывается во время его вызова.
Чтобы попрактиковаться с перегруженными методами, создайте новый проект консольного приложения по имени FunWithMethodOverloading. Добавьте новый класс по имени AddOperations.cs и приведите его код к следующему виду:
namespace FunWithMethodOverloading {
// Код С#.
// Overloaded Add() method.
public static class AddOperations
{
// Перегруженный метод Add().
public static int Add(int x, int y)
{
return x + y;
}
// Перегруженный метод Add().
public static double Add(double x, double y)
{
return x + y;
}
// Перегруженный метод Add().
public static long Add(long x, long y)
{
return x + y;
}
}
}
Замените код в Program.cs показанным ниже кодом:
using System;
using FunWithMethodOverloading;
using static FunWithMethodOverloading.AddOperations;
Console.WriteLine("***** Fun with Method Overloading *****n");
// Вызов версии int метода Add()
Console.WriteLine(Add(10, 10));
// Вызов версии long метода Add() с использованием нового
// разделителя групп цифр
Console.WriteLine(Add(900_000_000_000, 900_000_000_000));
// Вызов версии double метода Add()
Console.WriteLine(Add(4.3, 4.4));