Содержание
Параметры методов позволяют задать некоторые входные значения для метода. В предыдущей части мы уже затронули тему определения параметров методов в C#, разработав свой собственный метод для вывода разноцветного текста в консоль. Однако, на этом тема использования параметров в методах C# не исчерпывается и сегодня мы более детально рассмотрим использование параметров.
Параметры методов в C#: формальные и фактические параметры, аргументы
Прежде, чем мы перейдем к рассмотрению конкретных примеров, стоит немного разобраться с терминологией. В различной литературе мы можем встретить такие понятия, как формальный параметр, фактический параметр и аргумент. Вот, что на этот счёт говорит вики:
- Параметр — принятый методом аргумент
- Формальный параметр — аргумент, указываемый при объявлении или определении функции.
- Фактический параметр — аргумент, передаваемый в функцию при её вызове;
Всё, что касается параметров методов, мы можем представить в виде вот такой диаграммы
Рассмотрим эти определения, используя метод, который мы разработали в предыдущей части:
static void WriteColorText(string text, ConsoleColor color) { ConsoleColor oldColor = Console.ForegroundColor; //запоминаем текущий цвет текста Console.ForegroundColor = color; //меняем цвет на тот, который задан в параметрах Console.WriteLine(text); //выводим текст Console.ForegroundColor = oldColor; //возвращаем старый цвет }
при объявлении метода мы указали для этого метода два аргумента:
string text
— текст, который необходимо вывести в консольConsoleColor color
— цвет текста
В данном случае мы имеем дело с двумя формальными параметрами — text
и color
, так именно они фигурируют в объявлении метода. Теперь вызовем наш метод, например, так:
string hello = "Привет, мир!"; ConsoleColor red = ConsoleColor.Red; WriteColorText(hello, red);
здесь в метод передаются два аргумента (переменные):
string hello
— текст, который необходимо вывести в консольConsoleColor red
— цвет текста
Следуя определению hello
и red
— это фактические параметры метода, так как они передаются в метод при его вызове. Отсюда можно сделать небольшой вывод о том, что имена формальных и фактических параметров методов в C# могут не совпадать. Совсем другое дело — типы данных параметров.
Соответствие типов формальных и фактических параметров
При передаче в метод C# фактических параметров следует учитывать их тип. Тип формального и фактического параметра должны совпадать. Например, следующий код не скомпилируется:
string hello = "Привет, мир!"; ConsoleColor red = ConsoleColor.Red; WriteColorText(red, hello);
В Visual Studio вы увидите следующие ошибки:
Ошибка CS1503 Аргумент 2: не удается преобразовать из «string» в «System.ConsoleColor»
Здесь мы перепутали местами фактические параметры и попытались вместо строки передать цвет и наоборот — вместо цвета строку, что закономерно привело нас к ошибке.
Отдельного рассмотрения требует вопрос о преобразовании типов, но его мы рассмотрим позднее. Пока же стоит запомнить, что тип формального и фактического параметров в методах C# обязательно должен совпадать.
Именованные параметры методов
До сих пор мы передавали фактические параметры метода по позиции, то есть следование формальных и фактических параметров в методе было одинаковым — если первый формальный параметр строка, то и первый фактический параметр тоже строка. При этом, C# позволяет изменить порядок следования фактических параметров в методах, используя именованные параметры, использование которых выглядит следующим образом:
[модификаторы] тип_возвращаемого_значения Название_метода (имя_формального_параметра: значение_фактического параметра) { тело метода }
то есть, в круглых скобках мы должны указать имя формального параметра, поставить двоеточие и далее указать значение фактического параметра. Например, исправим предыдущий код так, чтобы использовать именованные параметры и не менять порядок следования фактических параметров при вызове метода:
string hello = "Привет, мир!"; ConsoleColor red = ConsoleColor.Red; WriteColorText(color: red, text: hello);
теперь никакой ошибки не будет и приложения скомпилируется. Возможно, что может показаться, что именованные параметры запутывают код C#, но на самом деле, именованные параметры, во-первых, помогают сделать код более понятным, а, во-вторых, такие именованные параметры широко используются в случае использования необязательных параметров методов.
Необязательные параметры метода C#
Необязательные параметры метода — это такие параметры, для которых при объявлении метода используются значения по умолчанию и такие параметры могут не указываться при вызове метода. При объявлении необязательного параметра используется следующая конструкция:
тип_параметра имя_параметра = значение_параметра
Например, вернемся к нашему методу и установим по умолчанию красный цвет текста:
static void WriteColorText(string text, ConsoleColor color = ConsoleColor.Red) { ConsoleColor oldColor = Console.ForegroundColor; //запоминаем текущий увет текста Console.ForegroundColor = color; //устанавливаем новый цвет текста Console.WriteLine(text); //выводим текст в консоль Console.ForegroundColor = oldColor; //возвращаем старый цвет }
теперь параметр color
стал необязательным, так как мы установили его значение по умолчанию. Теперь можно вызывать наш метод следующим образом:
WriteColorText(hello); //будет выведена строка с красным цветом текста WriteColorText(hello, ConsoleColor.Blue); //будет выведена строка с синим цветом текста WriteColorText(color: ConsoleColor.Yellow, text: "Желтый текст"); //будет выведена строка с желтым цветом текста
результат работы приложения:
При использовании в методах необязательных параметров стоит помнить следующее — необязательные параметры методов C# должны всегда располагаться последними при объявлении метода. Например, на следующий код Visual Studio выдаст ошибку:
static void WriteColorText(string text = "Привет, мир!", ConsoleColor color) {}
так как необязательный параметр стоит в методе впереди обязательного. При этом, мы можем сделать все параметры необязательными. Например, следующий код скомпилируется без ошибок:
static void WriteColorText(string text = "Привет, мир!", ConsoleColor color = ConsoleColor.Red) { }
Второй момент, который необходимо учитывать: при указании значений необязательных параметров по позиции нельзя пропускать указание параметра, который находится слева. Например, введем в наш метод ещё один параметр, который будет указывать следует ли в начале строки ставить табуляцию:
static void WriteColorText(string text, ConsoleColor color = ConsoleColor.Red, bool insertTab = false) { ConsoleColor oldColor = Console.ForegroundColor; //запоминаем текущий увет текста Console.ForegroundColor = color; //устанавливаем новый цвет текста if (insertTab) { Console.WriteLine($"\t{text}"); //выводим текст в консоль } else Console.WriteLine($"{text}"); //выводим текст в консоль Console.ForegroundColor = oldColor; //возвращаем старый цвет }
Этот параметр тоже необязательный. И теперь мы хотим вывести красный текст с табуляцией, то есть параметр color
не использовать, а использовать только text
и insertTab
. Если мы попробуем осуществить вызов метода вот так:
WriteColorText("Красный текст с отступом", true);
то получим ошибку:
Потому что мы пропустили необязательный параметр, стоящий слева от insertTab
, то есть, в данном случае, вызов должен был быть таким:
WriteColorText("Красный текст с отступом", ConsoleColor.Red, true);
Опять же, проблема решается легко с помощью именованных параметров. Следующий код скомпилируется:
WriteColorText(text: "Красный текст с отступом", insertTab: true);
Так как мы указали имена параметров, то компилятор C# присвоит отсутствующему параметру значение по умолчанию.
Итого
В этой части мы познакомились с тем, как можно определять параметры в методах C#, какие бывают параметры (обязательные, необязательные, формальные, фактические, именованные), а также способы использования параметров в методах.