Підрозділ 2.18
Повернення значення та оператор return
Пояснює повернення значень із методів, оператор return, ранній вихід із методу та використання результатів у виразах.
2.18. Повернення значення та оператор return
Методи, розглянуті в попередніх розділах, виконували дії — виводили рядки на екран, оновлювали стан, реєстрували події. Але справжня потужність методів розкривається тоді, коли вони не лише щось роблять, а й повертають результат своєї роботи назад до коду, що їх викликав. Саме так будуються обчислення, що складаються з послідовних кроків: один метод обчислює діагноз, інший формує звіт, третій виводить його — і кожен крок отримує результат попереднього.
У C# методи поділяються на два класи залежно від того, чи повертають вони значення. Методи з типом void виконують дію і нічого не повертають. Методи з будь-яким іншим типом — string, int, bool, double тощо — зобов'язані повернути значення відповідного типу за допомогою оператора return.

Синтаксис оператора return
Оператор return записується усередині тіла методу і складається з ключового слова та значення, що повертається:
return значення_що_повертається;Після виконання return метод негайно завершується — жоден рядок коду нижче вже не виконається, а управління повертається до місця виклику разом із зазначеним значенням.
Повернення значення: перший приклад
Визначимо метод, який повертає рядковий опис діагнозу пацієнта. Тип методу — string, тобто він зобов'язаний повернути рядок:
Метод GetPrimaryDiagnosis оголошений з типом string. Оператор return передає рядок назад до викликаючого коду, де він зберігається у змінній diagnosis. Компілятор знає тип заздалегідь і перевіряє відповідність ще до запуску програми.
Обов'язковість return у non-void методах
Якщо метод оголошений з типом, відмінним від void, він обов'язково повинен мати оператор return із відповідним значенням. Відсутність return є помилкою компіляції — програма навіть не запуститься:
// ПОМИЛКА КОМПІЛЯЦІЇ — не всі шляхи виконання повертають значення
string GetDiagnosis()
{
Console.WriteLine("Аналіз завершено");
// return відсутній — компілятор відмовить
}Компілятор C# аналізує всі можливі шляхи виконання тіла методу і перевіряє, чи кожен з них завершується оператором return. Якщо хоча б один шлях не повертає значення — це помилка.
Відповідність типів
Тип значення після return повинен точно відповідати оголошеному типу методу або допускати неявне перетворення до нього. Якщо метод оголошений як string, він не може повернути int або bool:
// ПОМИЛКА — тип методу string, але повертається int
string GetDiagnosis()
{
return 42; // компілятор відмовить: неможливо перетворити int в string
}// ПОМИЛКА — тип методу bool, але повертається string
bool IsPatientAdult()
{
return "так"; // неправильно — потрібен true або false
}Суворий контроль типів на етапі компіляції — захист від цілого класу помилок, які інакше проявились би лише під час виконання в невідповідний момент.
Використання результату методу
Значення, що повертає метод, можна присвоїти змінній, щоб використати його пізніше:
Кожен виклик GetDiagnosis повертає окреме значення залежно від аргументу. Змінна отримує конкретний рядок і далі може бути використана довільну кількість разів.
Результат методу також можна передати безпосередньо як аргумент іншому методу, не зберігаючи у проміжну змінну:
У виклику PrintDiagnosisReport(GetDiagnosis()) спочатку виконується GetDiagnosis() — його результат одразу передається параметру diagnosis методу PrintDiagnosisReport. Проміжна змінна не потрібна. Такий запис є поширеним у C# і робить код лаконічнішим, якщо результат використовується лише один раз.
Як виконується повернення значення
Коли програма виконує виклик методу, що повертає значення, відбувається наступна послідовність: управління переходить до тіла методу, метод виконує свою логіку, натрапляє на return, передає значення назад і завершується. Викликаючий код отримує це значення в точці виклику.

Складні вирази у return
Після ключового слова return можна записати не лише змінну або літерал, а й будь-який вираз — арифметичний, логічний, виклик іншого методу. Компілятор обчислить вираз і поверне результат:
Метод CalculateBMI повертає результат арифметичного виразу — значення обчислюється в момент виконання return. Метод IsNormalBMI повертає результат логічного виразу — true або false. Обидва методи не використовують проміжних змінних: return здатен повернути будь-який вираз відповідного типу.
Скорочені (expression-bodied) методи
Коли тіло методу складається лише з одного оператора return, C# дозволяє записати такий метод у скороченій формі за допомогою оператора => (лямбда-стрілка). Дужки і return при цьому опускаються:
тип_результату НазваМетоду(параметри) => вираз;Наприклад, повна форма:
string GetWard()
{
return "Кардіологія";
}Еквівалентна скороченій формі:
string GetWard() => "Кардіологія";Скорочена форма не є окремим механізмом — це лише синтаксичний цукор, який компілятор перетворює на повну форму автоматично. Поведінка ідентична. Скорочені методи широко використовуються для простих обчислень і запитів, де розгорнутий синтаксис був би надлишковим:
Як видно, скорочена форма добре читається для простих методів і дозволяє компактно визначити кілька методів поспіль. Для методів із гілками, циклами або кількома операціями слід використовувати повну форму.
Вихід із методу та недосяжний код
Оператор return не лише повертає значення — він негайно завершує виконання методу. Будь-який код, розташований після return у тому самому блоці виконання, є недосяжним і ніколи не виконається:
string GetStatus()
{
return "Стабільний";
Console.WriteLine("Це рядок не виконається"); // недосяжний код
}З синтаксичного погляду наведений код коректний, однак компілятор C# видає попередження (warning CS0162: «Виявлено недосяжний код»). Це сигнал про логічну помилку: програміст, можливо, мав намір виконати дію, але вона назавжди заблокована оператором return. Такий код слід прибирати.
Недосяжний код найчастіше виникає через помилку при рефакторингу — коли return переміщують, але забувають видалити рядки, що стоять після нього.
return у void-методах: ранній вихід
Оператор return можна застосовувати й у методах типу void — тих, що не повертають жодного значення. У цьому випадку після return не вказується ніяке значення, а сам оператор використовується виключно для дострокового завершення методу:
return;Типова ситуація — перевірка вхідних умов на початку методу. Якщо дані некоректні, метод одразу завершується, не виконуючи основну логіку. Цей патерн має назву Guard Clause (охоронна умова) — серія перевірок на початку методу, кожна з яких здійснює ранній вихід при порушенні інваріанту:

Розглянемо практичний приклад: метод реєстрації пацієнта повинен перевіряти коректність даних перед будь-якою обробкою.
Метод RegisterPatient містить дві охоронні умови. Перша перевіряє ім'я: якщо воно порожнє або складається лише з пробілів — виводить помилку і виходить. Друга перевіряє вік: якщо значення виходить за межі можливого — аналогічно завершує роботу. Тільки якщо обидві перевірки пройдено, виконується основна логіка реєстрації.
Такий підхід має кілька переваг. По-перше, основна логіка методу не загорнута у вкладені умови — вона читається прямолінійно. По-друге, кожна некоректна умова обробляється в одному місці і одразу при вході в метод. По-третє, метод сам гарантує коректність своїх передумов, а не покладається на перевірку ззовні.
Ранній вихід через return у void-методах є стандартною практикою C# і активно використовується в реальних проєктах для захисного програмування та покращення читабельності коду.