1. Основы C# и принципы ООП
Основы C# и принципы ООП
Язык программирования C# (произносится как си-шарп) был создан компанией Microsoft и сегодня является одним из самых востребованных инструментов для разработки серверной части веб-приложений. Бэкенд-разработчики ценят его за строгую типизацию, высокую производительность и мощную экосистему .NET — платформу, которая предоставляет готовые инструменты для работы с сетью, базами данных и безопасностью.
Для успешного прохождения технических собеседований на позицию Junior Backend Developer недостаточно просто знать синтаксис. Работодатели ожидают глубокого понимания того, как язык работает с памятью и как правильно проектировать архитектуру приложения с помощью объектов.
Базовый синтаксис и система типов
Любая программа работает с данными. В C# для хранения данных используются переменные — именованные области памяти. Каждая переменная имеет строгий тип данных, который определяет, какую информацию в ней можно хранить и сколько места в памяти она займет.
В бэкенд-разработке чаще всего используются следующие базовые типы:
* int — целые числа. Используется для идентификаторов пользователей, счетчиков или количества товаров.
* string — текст. Применяется для хранения имен, email-адресов или паролей (в зашифрованном виде).
bool — логический тип, принимающий значения true (истина) или false* (ложь). Удобен для флагов, например, подтвердил ли пользователь почту.
* decimal — числа с высокой точностью. В отличие от double, этот тип исключает ошибки округления, поэтому в коммерческой разработке все финансовые операции и цены хранятся исключительно в decimal.
> Строгая типизация C# означает, что если вы создали переменную для хранения чисел, вы не сможете случайно записать в нее текст. Это защищает разработчика от множества критических ошибок еще на этапе написания кода, до запуска программы на сервере.
Для управления логикой программы используются условные конструкции. Например, при авторизации пользователя на сайте сервер должен проверить его возраст. Если требуется убедиться, что возраст больше или равен совершеннолетию, применяется математическое сравнение . Если условие выполняется, сервер выдает доступ, если нет — возвращает ошибку.
В реальном бэкенде вместо вывода текста в консоль сервер отправит клиенту (например, мобильному приложению) специальный HTTP-статус, но базовая логика языка остается неизменной.
Объектно-ориентированное программирование (ООП)
Современные серверные приложения состоят из сотен тысяч строк кода. Если писать весь код сплошным текстом, он быстро станет нечитаемым. Для решения этой проблемы было придумано Объектно-ориентированное программирование — подход, при котором программа разбивается на независимые блоки, моделирующие сущности из реального мира.
Основой ООП являются два неразрывных понятия:
Представьте, что вы разрабатываете бэкенд для интернет-магазина. У вас есть сущность «Товар». Класс опишет, что у любого товара должны быть название и цена. А конкретный смартфон за 50 000 рублей — это уже объект этого класса.
В этом примере Name и Price называются полями класса. Создание объекта происходит с помощью ключевого слова new, которое выделяет память под новый экземпляр.
Четыре столпа ООП
На собеседованиях джуниоров всегда просят перечислить и объяснить базовые принципы ООП. Их понимание критически важно для проектирования надежных систем.
Инкапсуляция Это механизм сокрытия внутренних данных объекта от внешнего вмешательства. В бэкенде мы не должны позволять другим частям программы напрямую менять важные данные, например, баланс пользователя. Доступ к данным должен осуществляться только через специальные методы или свойства (properties), которые могут содержать логику проверки.
Аналогия: вы не можете напрямую залезть в двигатель банкомата, чтобы изменить количество денег на вашем счету. Вы взаимодействуете с банкоматом через безопасный интерфейс — клавиатуру и экран.
Наследование
Позволяет создать новый класс на основе уже существующего, переняв его свойства и методы. Это избавляет разработчика от дублирования кода. Если у нас есть базовый класс User (Пользователь) с полями логина и пароля, мы можем создать класс Admin (Администратор), который унаследует эти поля, но добавит свои уникальные права доступа.
Полиморфизм Свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Простыми словами: разные классы могут по-разному реагировать на одну и ту же команду.
Например, у нас есть метод CalculateDiscount() (Рассчитать скидку). Для обычного покупателя он вернет 0%, для VIP-клиента — 15%, а для сотрудника компании — 30%. Серверу не нужно писать десятки проверок if, он просто вызывает один и тот же метод у разных объектов, и каждый объект сам знает, как правильно рассчитать свою скидку.
Абстракция
Выделение значимых характеристик объекта и исключение незначимых. При проектировании класса User для системы доставки еды нам важны его адрес и номер телефона. Но нам абсолютно не важен его рост или цвет глаз. Мы абстрагируемся от лишних деталей, оставляя только то, что решает бизнес-задачу.
Управление памятью: значимые и ссылочные типы
Один из самых частых вопросов на техническом интервью: «В чем разница между значимыми (Value types) и ссылочными (Reference types) типами в C#?». Понимание этого механизма отличает хорошего бэкенд-разработчика от новичка, так как напрямую влияет на производительность сервера.
Оперативная память в .NET делится на две основные области: стек (Stack) и кучу (Heap).
| Характеристика | Стек (Stack) | Куча (Heap) |
| :--- | :--- | :--- |
| Что хранится | Значимые типы (int, bool, decimal, структуры) | Ссылочные типы (классы, строки, массивы) |
| Принцип работы | Данные хранятся напрямую. Память очищается автоматически при выходе из блока кода. | Хранятся сами данные, а в стеке лежит только ссылка (адрес) на эти данные. |
| Скорость | Очень быстрая | Медленнее, требует работы сборщика мусора |
Когда вы создаете переменную значимого типа, например int x = 5;, число 5 кладется прямо в стек. Если вы скопируете эту переменную int y = x;, в памяти появится независимая копия числа 5. Изменение y никак не повлияет на x.
Со ссылочными типами (например, объектами классов) всё иначе. Когда вы пишете Product p1 = new Product();, сам тяжелый объект создается в куче. А в переменную p1 (которая лежит в стеке) записывается только адрес этого объекта в куче.
Если вы напишете Product p2 = p1;, вы не скопируете объект. Вы скопируете только адрес. Теперь обе переменные указывают на один и тот же товар в памяти. Если вы измените цену через p2, цена изменится и для p1, потому что физически это один и тот же объект.
> Непонимание разницы между передачей по значению и по ссылке — причина большинства трудноуловимых багов у начинающих разработчиков, когда данные в базе неожиданно перезаписываются.
Очисткой кучи от ненужных объектов занимается специальный фоновый процесс — Garbage Collector (Сборщик мусора). Когда на объект в куче больше не остается ссылок из стека, сборщик мусора понимает, что объект больше не нужен, и освобождает оперативную память сервера. Это избавляет C#-разработчиков от необходимости удалять объекты вручную, как это делается в языках C или C++.
Освоив синтаксис, принципы ООП и устройство памяти, вы закладываете прочный фундамент. В реальных рабочих задачах эти знания применяются ежедневно: классы становятся таблицами в базе данных, инкапсуляция защищает API от взлома, а понимание работы памяти помогает серверам выдерживать нагрузку в тысячи запросов в секунду.