Методы в C#. Возвращаемые значения и оператор return

Методы 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(), то получится следующая цепочка операций:

  1. Доходим до строки с вызовом WriteText("Привет, мир!");
  2. Заходим в тело метода WriteText();
  3. Выводим текст, заданный в параметре метода, в консоль
  4. Возвращаемся в метод Main()
  5. Так как за вызовом метода ничего нет, то работа программы завершается.

Оператор return

Для того, чтобы метод C# что-либо возвращал, должно соблюдаться два условия:

  1. Тип возвращаемого методом значения должен быть отличным от void
  2. В теле метода (если это не сокращенный метод и не метод, возвращающий 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; 
        }
    }
}

В консоли мы увидим:

14

В данном случае, метод возвращает значение типа 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 в C#

Сокращенная запись методов с возвращаемым результатом

Если мы используем сокращенную запись метода, то необязательно использовать оператор 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("Вы достигли необходимого возраста - наслаждайтесь");
        }

    }
}
Этот контент имеет ограничение 18+
Вышли из метода 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("Вы достигли необходимого возраста - наслаждайтесь");
        }

    }
}

Запустим приложение:

Этот контент имеет ограничение 18+
Вы достигли необходимого возраста — наслаждайтесь
Вышли из метода CheckAge

Как видите, выход из метода не произошел и мы прошли всё тело метода от проверки возраста до вывода последнего сообщения в консоль. Таким образом, оператор return в методах без возвращаемого значения позволяет не выполнять тот код в теле метода, который нам по каким-либо причинам не требуется или вообще опасно выполнять при конкретных условиях.

Итого

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

Примеры, рассмотренные в этой части, всегда можно скачать с GitHub: Скачать код проекта из Github

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