Многие, кто только начинает знакомиться с языком C#, спотыкаются об одно, на первый взгляд, странное правило. Вы пишете кусочек кода, который должен что-то вычислить (например, найти скидку на товар или сложить два числа), а среда разработки вдруг подчёркивает строчку красным и выдаёт ошибку.
«Ах ты ж... — думаете вы. — Я же всё правильно написал!»
А ошибка гласит примерно следующее: «Не все функции возвращают значение». Давайте разберёмся, почему создатели языка поставили такое жёсткое требование и что это даёт обычному разработчику.
Что значит «обязана вернуть»?
Представьте себе автомат с газировкой. Вы нажимаете кнопку, бросаете монетку и ждёте, что автомат выдаст вам банку напитка. Если автомат проглотит деньги, покажет вам красивую анимацию, но ничего не выдаст — вы решите, что он сломался.
В мире программирования есть два типа кирпичиков (инструкций):
- Действия. Они просто что-то делают: включают свет, отправляют письмо, записывают файл на диск. Им не нужно ничего возвращать, как курьеру, который доставил посылку и ушёл.
- Вычисления. Они существуют, чтобы получить ответ. Например, «сколько будет 2 + 2?» Здесь без ответа никак.
Так вот, в C#, если вы создаёте блок для вычисления (на языке программистов — «функция» или «метод», но не суть), вы обязаны чётко заявить: в ответе я выдам число, или текст, или что-то ещё. И затем обязанность этого автора (программиста) — гарантировать, что при любом раскладе вычисление закончится выдачей результата.
Если такой результат не выдать — это не просто невежливо, это ошибка в коде. Программа не соберётся, пока вы не исправите.
Почему создатели языка такие строгие?
Разработчики языка C# (дядя Андерс и его команда) сделали это сознательно. Они исходили из принципа надёжности. Они рассуждали так:
Представьте, что вы попросили друга рассчитать, сколько нужно купить обоев для комнаты. Друг долго думает, а потом говорит: «Ну, я подумал... и всё». И замолкает. Вы же не сможете пойти в магазин? А если бы это был автопилот в самолёте, который должен был вычислить высоту?
В программах за каждым таким вычислением стоит важная логика. Если бы язык разрешал иногда возвращать результат, а иногда «забывать», в вашей программе поселился бы хаос. Непредсказуемость — главный враг хорошего кода.
Проще обнаружить ошибку при написании кода (она сразу красным подчёркнута), чем искать её потом, когда программа уже работает у тысячи людей и вдруг необъяснимо падает в самый неподходящий момент.
Что это даёт разработчику? Три железных плюса
Плюс первый: Спокойствие за свои деньги
Вы можете быть уверены: если вы написали блок кода, который должен вернуть число для расчёта цены, оно обязательно вернётся. Язык заставляет вас выполнить обещание. Вы спите спокойно, зная, что ваша программа не выдаст «пустышку» в ответственный момент.
Плюс второй: Умный помощник в среде разработки
В современных редакторах кода, как только вы начнёте писать «функцию», редактор сразу подсветит, где вы «забыли» вернуть значение. Это как автоинспектор на перекрёстке: он не даёт вам проехать на красный свет. Вы с первого раза учитесь писать правильно, без грязных приёмов.
Плюс третий: Читаемость для коллег (или для вас самого в будущем)
Когда вы видите в чужом коде такой блок, вы сразу понимаете: «Ага, это чёрный ящик, из которой обязательно выпадет готовый ответ. Мне не надо гадать, может там что-то есть или нет». Это упрощает разбор чужого кода, как простая инструкция к шкафу из ИКЕА без лишних хитростей.
Есть ли минусы? Да, и он ощутим
Минус у этого подхода ровно один, и новички спотыкаются о него постоянно.
Этот минус — избыточная строгость.
Иногда вам нужна функция, которая может вернуть результат, но может и не вернуть, если, например, искомого товара нет в базе данных. В реальной жизни это нормально: «Дай скидку для этого пользователя, а если его нет в списке — ну и ладно, ничего не давай».
В C# из-за этого правила приходится идти на хитрости. Вы не можете просто сказать: «Ничего не возвращаю». Язык требует: «Либо верни число, либо выброси ошибку и упади, либо возвращай специальное «пустое» значение».
Для новичка это выглядит как головная боль: «Зачем так сложно? Почему нельзя просто промолчать?» Но, как говорится, у любого хорошего инструмента есть свои строгие правила. Молоток ведь тоже не благодарит вас за удары по пальцам.
Лично меня, как старого (во всех смыслах))) паскалиста, это правило слегка бесит, хотя я и не новичок. Потому как привык к тому, что функции вовсе не обязаны возвращать значения.
Вместо итога
Правило «обязан вернуть значение» в C# — это не вредность создателей. Это предохранитель. Он защищает вас от самого коварного бага — «непредсказуемого пустого результата».
Да, поначалу он раздражает, заставляя прописывать лишние строчки. Но потом вы привыкаете и начинаете ценить эту чёткость. Это как в железнодорожном расписании: поезда ходят строго по минутам, а не когда машинист проснётся.
Хорошая программа — это та, в которой каждое действие имеет понятный и гарантированный итог. Именно этому и учит главное правило C#.
На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.