1. Введение
Давайте представим: вы заказываете пиццу по телефону (ну, или через приложение, всё-таки XXI век). Вы сообщаете оператору параметры заказа, и оператор возвращает вам результат: пиццу! Если оператор молчит — вы голодны, и счастья нет.
Так и с функциями: иногда их задача — выполнить действие, но часто хочется, чтобы функция ещё что-то полезное вернула, причём результат может быть разным каждый раз при разных входных данных! Например:
- Функция вычисляет сумму двух чисел и сообщает результат.
- Функция получает возраст человека и возвращает категорию ("ребёнок", "взрослый", "пенсионер").
- Функция формирует красивую строку для приветствия пользователя по имени.
Возвращаемое значение — способ функции “передать” наружу результат своей работы.
2. Сигнатура метода с возвращаемым значением
В прошлой лекции мы видели вот такой шаблон:
void PrintHello()
{
Console.WriteLine("Привет!");
}
Тип void означает, что функция ничего не возвращает (void означает "пусто", отсутствие значения).
Теперь посмотрим, как выглядит функция, которая что-то возвращает:
int Add(int a, int b)
{
// тело функции
}
Здесь int перед именем функции — это тип данных возвращаемого значения. То есть, если функция возвращает строку — пишем string, если дробное — double, и так далее.
Синтаксис объявления функции выглядит так:
<тип возвращаемого значения> ИмяМетода(<параметры>)
{
// тело функции
}
Примеры разных сигнатур:
| Сигнатура | Что возвращает |
|---|---|
|
Целое число |
|
Строку |
|
Дробное число |
|
Логическое значение |
3. Оператор return: как вернуть результат из функции
Чтобы всё работало, мало просто указать нужный тип — функцию нужно научить отправлять результат обратно “наверх”. Для этого служит оператор return. С его помощью мы говорим: вот, возвращаю вот это значение, и на этом функция заканчивает выполнение (она как бы "выходит" наружу в этот момент).
тип ИмяМетода(...)
{
// какие-то вычисления
return значение;
}
Пример:
int Add(int a, int b)
{
int sum = a + b;
return sum; // отправляем сумму как результат работы функции
}
Важное правило: тип значения, возвращаемого через return, должен полностью совпадать (или быть совместим) с типом, который вы указали в сигнатуре метода.
4. Примеры: пишем методы, которые что-то возвращают
Давайте сразу разберемся на примерах! Посмотрим на несколько популярных случаев.
Пример 1: суммирование двух чисел
int Add(int a, int b)
{
return a + b;
}
// Использование:
int result = Add(10, 20);
Console.WriteLine("Сумма: " + result); // Вывод: Сумма: 30
Пример 2: индивидуальное приветствие
string CreateGreeting(string name)
{
return "Привет, " + name + "!";
}
// Использование:
string greeting = CreateGreeting("Анна");
Console.WriteLine(greeting); // Вывод: Привет, Анна!
Пример 3: проверка совершеннолетия
bool IsAdult(int age)
{
return age >= 18;
}
if (IsAdult(21))
{
Console.WriteLine("Вход разрешён.");
}
else
{
Console.WriteLine("Извините, только для взрослых.");
}
// Вывод: Вход разрешён.
Пример 4: возвращаемое значение и использование в выражениях
Console.WriteLine("В два раза больше: " + MultiplyByTwo(7));
int MultiplyByTwo(int n)
{
return n * 2;
}
5. Тип возвращаемого значения: разнообразие и особенности
В C# функция может возвращать любой "тип" (а не только числа, строки и прочую классику). Вот несколько случаев:
- Целые числа: int, long, short — всё просто.
- Дробные: double, float, decimal.
- Строки: string.
- Булевы: bool.
- Массивы: int[], string[] и так далее.
- Ссылочные типы: объекты классов, созданных вами.
- void: особый случай, когда ничего не возвращается.
Почему тип возвращаемого значения так важен?
Компилятор строго следит за тем, чтобы вы возвращали то, что обещали. Если пообещали вернуть int, а пытаетесь вернуть строку или вообще ничего — получите ошибку. Такой себе строгий начальник.
Пример ошибки:
int GetNumber()
{
return "42"; // Ошибка! Ожидался int, а не string.
}
6. Оператор return без значения: для void-методов
Справедливости ради, в методах с объявленным возвращаемым типом (например, int, string) оператор return всегда должен сопровождаться значением, которое мы хотим вернуть.
Но! Если функция объявлена с типом void, вы всё равно можете, при желании, использовать return без значения — чтобы немедленно завершить выполнение функции.
void PrintNumbers(int n)
{
if (n <= 0)
{
Console.WriteLine("Число не должно быть отрицательным!");
return; // Просто выходим из функции, ничего не возвращая
}
for (int i = 1; i <= n; i++)
{
Console.WriteLine(i);
}
}
Это может быть удобно, если вы хотите прервать выполнение функции по какому-то условию, но возвращать ничего не нужно.
7. Типичные ошибки при использовании return
Ах, как часто начинающие разработчики ломают себе голову над ошибками, связанных с return!
Проблема №1: нет return в функции, которая что-то должна возвращать
int GetValue(bool flag)
{
if (flag)
return 1;
// Ой! А что, если flag == false?
}
// Ошибка: не все ветки кода содержат return!
Решение: всегда предусмотрите return на всех сценариях исполнения функции! Например:
int GetValue(bool flag)
{
if (flag)
return 1;
else
return 0;
}
Проблема №2: несовпадение типа возвращаемого значения
double GetMagicNumber()
{
return 42; // По идее, корректно (int можно неявно привести к double)
// Но если бы функция возвращала int, а мы вернули строку — получили бы ошибку!
}
Правило: следите за совместимостью типов. Если есть сомнения — можете явно привести к нужному типу:
return (double)42;
Проблема №3: несвоевременный return
Знайте, что как только выполняется return, выполнение метода мгновенно прерывается. Всё, что написано дальше, не выполнится!
int GetNumber()
{
return 5;
Console.WriteLine("Это строка никогда не будет исполнена"); // компилятор даже ругнётся!
}
Проблема №4: return в void-методе с возвращаемым значением (запрещено!)
void PrintSomething()
{
return 1; // Нельзя возвращать значение из void-метода!
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ