Методы в C#. Параметры методов

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

Параметры методов в C#: формальные и фактические параметры, аргументы

Прежде, чем мы перейдем к рассмотрению конкретных примеров, стоит немного разобраться с терминологией. В различной литературе мы можем встретить такие понятия, как формальный параметр, фактический параметр и аргумент. Вот, что на этот счёт говорит вики:

  • Параметр — принятый методом аргумент
  • Формальный параметр — аргумент, указываемый при объявлении или определении функции.
  • Фактический параметр — аргумент, передаваемый в функцию при её вызове;

Всё, что касается параметров методов, мы можем представить в виде вот такой диаграммы

Параметры методов в C#

Рассмотрим эти определения, используя метод, который мы разработали в предыдущей части:

static void WriteColorText(string text, ConsoleColor color)
{
    ConsoleColor oldColor = Console.ForegroundColor; //запоминаем текущий цвет текста
    Console.ForegroundColor = color; //меняем цвет на тот, который задан в параметрах
    Console.WriteLine(text); //выводим текст
    Console.ForegroundColor = oldColor; //возвращаем старый цвет
}

при объявлении метода мы указали для этого метода два аргумента:

  1. string text — текст, который необходимо вывести в консоль
  2. ConsoleColor color — цвет текста

В данном случае мы имеем дело с двумя формальными параметрамиtext и color, так именно они фигурируют в объявлении метода. Теперь вызовем наш метод, например, так:

string hello = "Привет, мир!";
ConsoleColor red = ConsoleColor.Red;
WriteColorText(hello, red);

здесь в метод передаются два аргумента (переменные):

  1. string hello — текст, который необходимо вывести в консоль
  2. ConsoleColor red — цвет текста

Следуя определению hello и red — это фактические параметры метода, так как они передаются в метод при его вызове. Отсюда можно сделать небольшой вывод о том, что имена формальных и фактических параметров методов в C# могут не совпадать. Совсем другое дело — типы данных параметров.

Соответствие типов формальных и фактических параметров

При передаче в метод C# фактических параметров следует учитывать их тип. Тип формального и фактического параметра должны совпадать. Например, следующий код не скомпилируется:

string hello = "Привет, мир!";
ConsoleColor red = ConsoleColor.Red;
WriteColorText(red, hello);

В Visual Studio вы увидите следующие ошибки:

Параметры методов в C#

Ошибка CS1503 Аргумент 1: не удается преобразовать из «System.ConsoleColor» в «string».
Ошибка 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#

При использовании в методах необязательных параметров стоит помнить следующее — необязательные параметры методов C# должны всегда располагаться последними при объявлении метода. Например, на следующий код Visual Studio выдаст ошибку:

static void WriteColorText(string text = "Привет, мир!", ConsoleColor color)
{}
Ошибка CS1737 Необязательные параметры должны быть указаны после всех требуемых параметров.

так как необязательный параметр стоит в методе впереди обязательного. При этом, мы можем сделать все параметры необязательными. Например, следующий код скомпилируется без ошибок:

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

то получим ошибку:

Ошибка CS1503 Аргумент 2: не удается преобразовать из «bool» в «System.ConsoleColor».

Потому что мы пропустили необязательный параметр, стоящий слева от insertTab, то есть, в данном случае, вызов должен был быть таким:

WriteColorText("Красный текст с отступом", ConsoleColor.Red, true);

Опять же, проблема решается легко с помощью именованных параметров. Следующий код скомпилируется:

WriteColorText(text: "Красный текст с отступом", insertTab: true);

Так как мы указали имена параметров, то компилятор C# присвоит отсутствующему параметру значение по умолчанию.

Итого

В этой части мы познакомились с тем, как можно определять параметры в методах C#, какие бывают параметры (обязательные, необязательные, формальные, фактические, именованные), а также способы использования параметров в методах.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии