C#
Возвращение значения и оператор return

Возвращение значения и оператор return

Метод может возвращать значение, какой-либо результат. В примере выше были определены два метода, которые имели тип void. Методы с таким типом не возвращают никакого значения. Они просто выполняют некоторые действия.

Но методы также могут возвращать некоторое значение. Для этого применяется оператор return, после которого идет возвращаемое значение:

return возвращаемое значение;

Например, определим метод, который возвращает значение типа string:

string GetMessage()
{
    return "Hello";
}

Метод GetMessage имеет тип string, следовательно, он должен возвратить строку. Поэтому в теле метода используется оператор return, после которого указана возвращаемая строка.

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

string GetMessage()
{
    Console.WriteLine("Hello");
}

Также между возвращаемым типом метода и возвращаемым значением после оператора return должно быть соответствие. Например, в следующем случае возвращаемый тип - string, но метод возвращает число (тип int), поэтому такое определение метода некорректно:

string GetMessage()
{
    return 3;   // Ошибка! Метод должен возвращать строку, а не число
}

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

string GetMessage()
{
    return "Hello";
}

string message = GetMessage();  // получаем результат метода в переменную message
Console.WriteLine(message);     // Hello

Метод GetMessage() возвращает значение типа string. Поэтому мы можем присвоить это значение какой-нибудь переменной типа string: string message = GetMessage();

Либо даже передать в качестве значения параметру другого метода:

string GetMessage()
{
    return "Hello";
}
void PrintMessage(string message)
{
    Console.WriteLine(message);
}
PrintMessage(GetMessage());

В вызове PrintMessage(GetMessage()) сначала вызывается метод GetMessage() и его результат передается параметру message метода PrintMessage

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

int Sum(int x, int y)
{
    return x + y;
}
 
int result = Sum(10, 15);       // 25
Console.WriteLine(result);      // 25
 
Console.WriteLine(Sum(5, 6));   // 11

Метод Sum() имеет тип int, следовательно, он должен возвратить значение типа int - целое число. Поэтому в теле метода используется оператор return, после которого указано возвращаемое число (в данном случае результат суммы переменных x и y).

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

Также мы можем сокращать методы, которые возвращают значение:

string GetMessage()
{
    return "hello";
}

аналогичен следующему методу:

string GetMessage() => "hello";

А метод

int Sum(int x, int y)
{
    return x + y;
}

аналогичен следующему методу:

int Sum(int x, int y) => x + y;

Выход из метода

Оператор return не только возвращает значение, но и производит выход из метода. Поэтому он должен определяться после остальных инструкций. Например:

string GetHello()
{
    return "Hello";
    Console.WriteLine("After return");
}

С точки зрения синтаксиса данный метод корректен, однако его инструкция Console.WriteLine("After return") не имеет смысла - она никогда не выполнится, так как до ее выполнения оператор return возвратит значение и произведет выход из метода.

Однако мы можем использовать оператор return и в методах с типом void. В этом случае после оператора return не ставится никакого возвращаемого значения (ведь метод ничего не возвращает). Типичная ситуация - в зависимости от определенных условий произвести выход из метода:

void PrintPerson(string name, int age)
{
    if(age > 120 || age < 1)
    {
        Console.WriteLine("Недопустимый возраст");
        return;
    }
    Console.WriteLine($"Имя: {name}  Возраст: {age}");
}
 
PrintPerson("Tom", 37);         // Имя: Tom  Возраст: 37
PrintPerson("Duncan", 1234);    // Недопустимый возраст

Здесь метод PrintPerson() в качестве параметров принимает имя и возраст пользователя. Однако в методе вначале мы проверяем, соответствует ли возраст некоторому диапазону (меньше 120 и больше 0). Если возраст находится вне этого диапазона, то выводим сообщение о недопустимом возрасте и с помощью оператора return выходим из метода. После этого метод заканчивает свою работу.

Однако если возраст корректен, то выводим информацию о пользователе на консоль. Консольный вывод:

Имя: Tom Возраст: 37
Недопустимый возраст