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-методу!
}
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ