Добавить в корзинуПозвонить
Найти в Дзене

Почему в C# нельзя просто так взять и ничего не вернуть? Секрет строгих правил

Многие, кто только начинает знакомиться с языком C#, спотыкаются об одно, на первый взгляд, странное правило. Вы пишете кусочек кода, который должен что-то вычислить (например, найти скидку на товар или сложить два числа), а среда разработки вдруг подчёркивает строчку красным и выдаёт ошибку. «Ах ты ж... — думаете вы. — Я же всё правильно написал!» А ошибка гласит примерно следующее: «Не все функции возвращают значение». Давайте разберёмся, почему создатели языка поставили такое жёсткое требование и что это даёт обычному разработчику. Представьте себе автомат с газировкой. Вы нажимаете кнопку, бросаете монетку и ждёте, что автомат выдаст вам банку напитка. Если автомат проглотит деньги, покажет вам красивую анимацию, но ничего не выдаст — вы решите, что он сломался. В мире программирования есть два типа кирпичиков (инструкций): Так вот, в C#, если вы создаёте блок для вычисления (на языке программистов — «функция» или «метод», но не суть), вы обязаны чётко заявить: в ответе я выдам чис
Оглавление

Многие, кто только начинает знакомиться с языком C#, спотыкаются об одно, на первый взгляд, странное правило. Вы пишете кусочек кода, который должен что-то вычислить (например, найти скидку на товар или сложить два числа), а среда разработки вдруг подчёркивает строчку красным и выдаёт ошибку.

«Ах ты ж... — думаете вы. — Я же всё правильно написал!»

А ошибка гласит примерно следующее: «Не все функции возвращают значение». Давайте разберёмся, почему создатели языка поставили такое жёсткое требование и что это даёт обычному разработчику.

Что значит «обязана вернуть»?

Представьте себе автомат с газировкой. Вы нажимаете кнопку, бросаете монетку и ждёте, что автомат выдаст вам банку напитка. Если автомат проглотит деньги, покажет вам красивую анимацию, но ничего не выдаст — вы решите, что он сломался.

В мире программирования есть два типа кирпичиков (инструкций):

  1. Действия. Они просто что-то делают: включают свет, отправляют письмо, записывают файл на диск. Им не нужно ничего возвращать, как курьеру, который доставил посылку и ушёл.
  2. Вычисления. Они существуют, чтобы получить ответ. Например, «сколько будет 2 + 2?» Здесь без ответа никак.

Так вот, в C#, если вы создаёте блок для вычисления (на языке программистов — «функция» или «метод», но не суть), вы обязаны чётко заявить: в ответе я выдам число, или текст, или что-то ещё. И затем обязанность этого автора (программиста) — гарантировать, что при любом раскладе вычисление закончится выдачей результата.

Если такой результат не выдать — это не просто невежливо, это ошибка в коде. Программа не соберётся, пока вы не исправите.

Почему создатели языка такие строгие?

Разработчики языка C# (дядя Андерс и его команда) сделали это сознательно. Они исходили из принципа надёжности. Они рассуждали так:

Представьте, что вы попросили друга рассчитать, сколько нужно купить обоев для комнаты. Друг долго думает, а потом говорит: «Ну, я подумал... и всё». И замолкает. Вы же не сможете пойти в магазин? А если бы это был автопилот в самолёте, который должен был вычислить высоту?

В программах за каждым таким вычислением стоит важная логика. Если бы язык разрешал иногда возвращать результат, а иногда «забывать», в вашей программе поселился бы хаос. Непредсказуемость — главный враг хорошего кода.

Проще обнаружить ошибку при написании кода (она сразу красным подчёркнута), чем искать её потом, когда программа уже работает у тысячи людей и вдруг необъяснимо падает в самый неподходящий момент.

Что это даёт разработчику? Три железных плюса

Плюс первый: Спокойствие за свои деньги

Вы можете быть уверены: если вы написали блок кода, который должен вернуть число для расчёта цены, оно обязательно вернётся. Язык заставляет вас выполнить обещание. Вы спите спокойно, зная, что ваша программа не выдаст «пустышку» в ответственный момент.

Плюс второй: Умный помощник в среде разработки

В современных редакторах кода, как только вы начнёте писать «функцию», редактор сразу подсветит, где вы «забыли» вернуть значение. Это как автоинспектор на перекрёстке: он не даёт вам проехать на красный свет. Вы с первого раза учитесь писать правильно, без грязных приёмов.

Плюс третий: Читаемость для коллег (или для вас самого в будущем)

Когда вы видите в чужом коде такой блок, вы сразу понимаете: «Ага, это чёрный ящик, из которой обязательно выпадет готовый ответ. Мне не надо гадать, может там что-то есть или нет». Это упрощает разбор чужого кода, как простая инструкция к шкафу из ИКЕА без лишних хитростей.

Есть ли минусы? Да, и он ощутим

Минус у этого подхода ровно один, и новички спотыкаются о него постоянно.

Этот минус — избыточная строгость.

Иногда вам нужна функция, которая может вернуть результат, но может и не вернуть, если, например, искомого товара нет в базе данных. В реальной жизни это нормально: «Дай скидку для этого пользователя, а если его нет в списке — ну и ладно, ничего не давай».

В C# из-за этого правила приходится идти на хитрости. Вы не можете просто сказать: «Ничего не возвращаю». Язык требует: «Либо верни число, либо выброси ошибку и упади, либо возвращай специальное «пустое» значение».

Для новичка это выглядит как головная боль: «Зачем так сложно? Почему нельзя просто промолчать?» Но, как говорится, у любого хорошего инструмента есть свои строгие правила. Молоток ведь тоже не благодарит вас за удары по пальцам.

Лично меня, как старого (во всех смыслах))) паскалиста, это правило слегка бесит, хотя я и не новичок. Потому как привык к тому, что функции вовсе не обязаны возвращать значения.

Вместо итога

Правило «обязан вернуть значение» в C# — это не вредность создателей. Это предохранитель. Он защищает вас от самого коварного бага — «непредсказуемого пустого результата».

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

Хорошая программа — это та, в которой каждое действие имеет понятный и гарантированный итог. Именно этому и учит главное правило C#.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.