Содержание
Методы C# могут возвращать какие-либо значения. До сих пор мы использовали в примерах методы, которые не возвращали ничего и использовали в описании специальный тип void
. В этой части мы рассмотрим, как метод может что-либо возвращать и как работать с результатами, возвращаемыми методами в C#.
Основные определения
При рассмотрении темы методов в C# часто можно встретить такие термины, как основная подпрограмма, основная программа, вызывающий код. Всё это, в принципе, идентичные понятия. Применительно к теме методов C# все эти термины можно объединить под одним определением — это тот блок кода в котором осуществляется вызов метода. Например, посмотрим на следующий код:
namespace FirstMethod { internal class Program { static void Main(string[] args) { WriteText("Привет, мир!"); } static void WriteText(string text) { Console.WriteLine(text); } } }
Здесь определены два метода — Main()
и WriteText()
. Второй метод вызывается в методе Main()
для того, чтобы вывести в консоль какой-то текст. В данном случае, основной подпрограммой выступает метод Main()
— в нем происходит вызов метода WriteText()
и в него же мы вернемся после того, как текст будет выведен в консоль. Если рассматривать работу программы по-шагово, начиная в первой строки метода Main()
, то получится следующая цепочка операций:
- Доходим до строки с вызовом
WriteText("Привет, мир!")
; - Заходим в тело метода
WriteText()
; - Выводим текст, заданный в параметре метода, в консоль
- Возвращаемся в метод
Main()
- Так как за вызовом метода ничего нет, то работа программы завершается.
Оператор return
Для того, чтобы метод C# что-либо возвращал, должно соблюдаться два условия:
- Тип возвращаемого методом значения должен быть отличным от
void
- В теле метода (если это не сокращенный метод и не метод, возвращающий
Task
) должен использоваться операторreturn
. Про типTask
мы поговорим намного позднее, поэтому пока можно его не запоминать
Оператор return
в методе, возвращающем значение, используется следующим образом:
return возвращаемое_значение
Например, объявим метод, который производит сложение двух чисел:
static int Sum(int a, int b) { return a + b; }
здесь метод сразу вернет значение a + b
. Вызовем этот метод в приложении и посмотрим на результат:
namespace ReturnValues { internal class Program { static void Main(string[] args) { int value = Sum(10, 4); //присвоили переменной значение, возвращаемое методом Console.WriteLine(value); //вывели значение в консоль } static int Sum(int a, int b) { return a + b; } } }
В консоли мы увидим:
В данном случае, метод возвращает значение типа int
и нам необходимо решить, что с ним далее делать — вывести на экран, присвоить другой переменной, передать в другой метод и т.д. В примере мы присвоили полученное из метода значение новой переменной value
и затем вывели значение переменной в консоль. Если нам не требуется нигде использовать значение, которое вернет наш метод, а только вывести его в консоль, то можно обойтись и без лишней переменной, то есть сделать вот так:
Console.WriteLine(Sum(5,5)); //рассчитали сумму и сразу вывели в консоль вызвав метод Console.WriteLine()
Следует отметить, что оператор return
возвращает значение и сразу прерывает работу метода, возвращая нас в основную подпрограмму. То есть код, находящийся под вызовом оператора return
будет проигнорирован.
static int Sum(int a, int b) { return a + b; Console.WriteLine(a + b); //этот код никогда не выполнится }
Недостижимый код не является ошибкой — программа будет скомпилирована, но Visual Studio выделит его и укажет на проблему:
Сокращенная запись методов с возвращаемым результатом
Если мы используем сокращенную запись метода, то необязательно использовать оператор return
. Например, следующий метод также возвращает результат — сумму двух чисел:
static int Sum(int a, int b) => a + b;
Оператор return и выход из метода
Оператор return
может использоваться также и в методах с типом void
, в качестве оператора выхода из метода. В этом случае, справа от оператора не должно быть ничего. Например, рассмотрим следующий метод:
static void CheckAge(int age) { if (age < 18) { Console.WriteLine("Этот контент имеет ограничение 18+"); return; } Console.WriteLine("Вы достигли необходимого возраста - наслаждайтесь"); }
Посмотрим, что здесь происходит. Метод в качестве параметра принимает целочисленное значение — возраст (age
). Если возраст менее 18 лет, то выводится сообщение «Этот контент имеет ограничение 18+» и работа метод прекращается — срабатывает метод return, которые «выкинет» нас в основную программу (в место в коде откуда шел вызов метода). Если же возраст будет 18 и больше лет, то в консоль выведется сообщение «Вы достигли необходимого возраста — наслаждайтесь». Запустим приложение и посмотрим на результат. Код всего приложения:
namespace ReturnValues { internal class Program { static void Main(string[] args) { CheckAge(15); Console.WriteLine("Вышли из метода CheckAge"); } static void CheckAge(int age) { if (age < 18) { Console.WriteLine("Этот контент имеет ограничение 18+"); return; } Console.WriteLine("Вы достигли необходимого возраста - наслаждайтесь"); } } }
Вышли из метода CheckAge
Изменим значение параметра в вызове метода:
CheckAge(18);
Результат будет таким:
Вышли из метода CheckAge
Чтобы увидеть как работает в данном случае оператор return, закомментируйте его, и передайте в метод CheckAge значение менее 18. То есть код программы теперь будет таким:
namespace ReturnValues { internal class Program { static void Main(string[] args) { CheckAge(15); Console.WriteLine("Вышли из метода CheckAge"); } static void CheckAge(int age) { if (age < 18) { Console.WriteLine("Этот контент имеет ограничение 18+"); // return; } Console.WriteLine("Вы достигли необходимого возраста - наслаждайтесь"); } } }
Запустим приложение:
Вы достигли необходимого возраста — наслаждайтесь
Вышли из метода CheckAge
Как видите, выход из метода не произошел и мы прошли всё тело метода от проверки возраста до вывода последнего сообщения в консоль. Таким образом, оператор return
в методах без возвращаемого значения позволяет не выполнять тот код в теле метода, который нам по каким-либо причинам не требуется или вообще опасно выполнять при конкретных условиях.
Итого
Возвращаемые значения методов C# могут использоваться в качестве значений переменных или использоваться как параметры других методов. Оператор return
возвращает значение метода и прерывает его работу. В методах с типом void
оператор просто прерывает работу метода и возвращает нас в основную подпрограмму.
Примеры, рассмотренные в этой части, всегда можно скачать с GitHub: Скачать код проекта из Github