---
title: Базовые вопросы
seo:
  title: "Базовые вопросы — С# Developer"
  description: "Тема «Базовые вопросы» для собеседования С# Developer. Назовите основные принципы ООП. Как принципы ООП реализованы в C# и какие ограничения есть у наследования?"
---

[Все темы С# Developer](/s-developer)

## <strong>Назовите основные принципы ООП</strong> [#q-14bee738d69b81909832c4009a5bbece]

Основные принципы ООП&#58;

{/* prettier-ignore */}
1. <strong>Инкапсуляция</strong>&#58;

    - Сокрытие внутренней реализации объекта и предоставление интерфейса для взаимодействия с ним.

1. <strong>Наследование</strong>&#58;

    - Возможность создания нового класса на основе существующего, с заимствованием свойств и методов.

1. <strong>Полиморфизм</strong>&#58;

    - Способность объектов разного типа обрабатывать данные через единый интерфейс.

1. <strong>Абстракция</strong>&#58;

    - Выделение общих характеристик объектов и создание абстрактных классов и интерфейсов.

:::note[Ссылки для изучения]

1. [Погружаемся в ООП](https://sky.pro/media/pogruzhaemsya-v-oop-osnovnye-princzipy-i-ih-realizacziya/)
   :::

---

## Как принципы ООП реализованы в C# и какие ограничения есть у наследования? [#q-14bee738d69b81179416ed2c737843d4]

ООП-принципы с примерами&#58;

{/* prettier-ignore */}
1. <strong>Инкапсуляция</strong>&#58;

    - Сокрытие деталей реализации класса и предоставление доступа только к необходимым методам.

    - Пример&#58; У класса <code>Car</code> есть приватные поля <code>engine</code> и <code>fuel</code>, доступ к которым осуществляется через публичные методы <code>startEngine&#40;&#41;</code> и <code>refuel&#40;&#41;</code>.

    ```csharp
    public class Car {
        private Engine engine;
        private int fuel;
        public void StartEngine() {
            // Logic to start engine
        }
        public void Refuel(int amount) {
            // Logic to refuel
        }
    }
    ```

1. <strong>Наследование</strong>&#58;

    - Создание нового класса на основе существующего, с заимствованием свойств и методов.

    - Пример&#58; Класс <code>ElectricCar</code> наследует от класса <code>Car</code> и добавляет свои особенности.

    ```csharp
    public class ElectricCar : Car {
        public int BatteryLevel { get; set; }
        public void ChargeBattery(int amount) {
            // Logic to charge battery
        }
    }
    ```

1. <strong>Полиморфизм</strong>&#58;

    - Способность объектов разного типа обрабатывать данные через единый интерфейс.

    - Пример&#58; Метод <code>Drive</code> принимает параметр типа <code>Car</code>, но может работать с объектами <code>ElectricCar</code> и <code>GasCar</code>.

    ```csharp
    public void Drive(Car car) {
        car.StartEngine();
        // Drive logic
    }
    ```

1. <strong>Абстракция</strong>&#58;

    - Выделение общих характеристик объектов и создание абстрактных классов и интерфейсов.

    - Пример&#58; Интерфейс <code>IVehicle</code> определяет методы <code>StartEngine</code> и <code>Drive</code>.

    ```csharp
    public interface IVehicle {
        void StartEngine();
        void Drive();
    }
    public class Car : IVehicle {
        public void StartEngine() {
            // Logic to start engine
        }
        public void Drive() {
            // Drive logic
        }
    }
    ```

#### Дополнительные вопросы

{/* prettier-ignore */}
- <strong>От какого класса неявно наследуются все классы в .NET?</strong>

    - Все классы неявно наследуются от класса <code>System&#46;Object</code>.

- <strong>Разрешено ли множественное наследование в C#?</strong>

    - В C# не разрешено множественное наследование классов, но разрешено множественное наследование интерфейсов.

:::note[Ссылки для изучения]

1. [Основы ООП](https://itmouse.by/blog/ob-ektno-orientirovannoe-programmirovanie#:~:text=%D0%92%D1%8B%D0%B4%D0%B5%D0%BB%D1%8F%D1%8E%D1%82%20%D1%87%D0%B5%D1%82%D1%8B%D1%80%D0%B5%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%B0%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%3A,%D0%BF%D0%B0%D1%80%D0%B0%D0%B4%D0%B8%D0%B3%D0%BC%D0%B0%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D0%BB%D0%B0%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20%D1%88%D0%B8%D1%80%D0%BE%D0%BA%D0%BE%D0%B5%20%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5)
   :::

---

## <strong>Что такое рекурсия?</strong> [#q-14bee738d69b812b81f9d0aac5c557f2]

Рекурсия — это поведение функции, при котором она вызывает сама себя. Такие функции называются рекурсивными. В отличие от цикла, они не просто повторяются несколько раз, а работают «внутри» друг друга

:::note[Ссылки для изучения]

1. [Рекурсия в программировании](https://blog.skillfactory.ru/glossary/rekursiya/)
   :::

---

## <strong>Что такое лямбда-выражение?</strong> [#q-14bee738d69b81a29b54f2b06fda8518]

<strong>Лямбда-выражение</strong> — это краткая форма записи анонимного метода,
используемая для создания делегатов или выражений.

#### Пример&#58;

```csharp
Func<int, int, int> add = (a, b) => a + b;
```

Лямбда-выражение <code>&#40;a&#44; b&#41; &#61;&#62; a &#43; b</code> описывает функцию, которая принимает два аргумента и возвращает их сумму.

:::note[Ссылки для изучения]

1. [Лямбда-функции в C#](https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/operators/lambda-expressions)
   :::

---

## <strong>Что такое параллельное программирование (многопоточность) и его назначение? Какие классы используются?</strong> [#q-14bee738d69b81cd928feb811dcb200a]

<strong>Параллельное программирование</strong> или
<strong>многопоточность</strong> — это подход к разработке программ, при котором
различные части кода выполняются параллельно в нескольких потоках. Это позволяет
улучшить производительность программы, эффективно использовать ресурсы
многопроцессорных систем, улучшить отзывчивость приложения и повысить его
отказоустойчивость.

В .NET для реализации параллельного программирования существует несколько классов и инструментов, основными из которых являются&#58;

{/* prettier-ignore */}
1. <strong>Класс</strong> <code>Thread</code>&#58;

    - Представляет поток выполнения в .NET.

    - Создание и управление потоками напрямую с помощью класса <code>Thread</code> требует определенного уровня низкоуровневых навыков и может быть не самым удобным способом реализации параллельного программирования.

1. <strong>Пространство имен</strong> <code>System&#46;Threading&#46;Tasks</code>&#58;

    - Предоставляет более высокоуровневый и удобный способ работы с параллельными задачами.

    - Task представляет операцию, которая может завершиться в будущем. Она не обязана выполняться параллельно или занимать отдельный поток.

1. <strong>Пространство имен</strong> <code>System&#46;Threading</code>&#58;

    - Содержит множество классов и методов для работы с многопоточностью, включая <code>ThreadPool</code>, <code>Mutex</code>, <code>Monitor</code>, <code>Semaphore</code> и другие.

1. <strong>Асинхронное программирование</strong>&#58;

    - Классы и методы для работы с асинхронным программированием, такие как ключевые слова <code>async&#47;await</code>, асинхронные методы и классы <code>Task</code> и <code>Task&#60;T&#62;</code>, позволяют реализовать асинхронные операции без блокировки основного потока.

Использование этих классов и инструментов позволяет разработчикам создавать параллельные и асинхронные приложения в .NET, которые могут эффективно использовать мощности многопроцессорных систем и предоставлять более отзывчивый и отказоустойчивый пользовательский опыт.

:::note[Ссылки для изучения]

1. [Параллельное программирование в C#](https://metanit.com/sharp/tutorial/12.1.php)
   :::

---

## <strong>Какие</strong> <code>GoF</code><strong>-паттерны использовали?</strong> [#q-14bee738d69b81dea394e8bf5559f40c]

Шаблоны проектирования <code>GoF</code> — это набор классических шаблонов проектирования, описанных в книге "Design Patterns&#58; Elements of Reusable Object-Oriented Software". В .NET разработке также используются различные шаблоны проектирования GoF для улучшения архитектуры и повышения гибкости приложений.

Ниже приведены некоторые из популярных GoF-паттернов, которые часто используются в .NET&#58;

{/* prettier-ignore */}
1. <strong>Паттерн Фабричный метод (</strong><code>Factory Method</code><strong>)</strong>&#58;

    - Используется для определения интерфейса создания объекта, но позволяет подклассам изменять тип создаваемого объекта.

    - В .NET его можно реализовать с помощью интерфейсов или абстрактных классов.

1. <strong>Паттерн Одиночка (</strong><code>Singleton</code><strong>)</strong>&#58;

    - Гарантирует, что класс имеет только один экземпляр, и предоставляет глобальный доступ к этому экземпляру.

    - Реализовать можно, например, с использованием статического поля и ленивой инициализации.

1. <strong>Паттерн Адаптер (</strong><code>Adapter</code><strong>)</strong>&#58;

    - Преобразует интерфейс одного класса в интерфейс другого класса, который клиентский код ожидает.

    - В .NET его можно использовать для адаптации различных интерфейсов или классов.

1. <strong>Паттерн Декоратор (</strong><code>Decorator</code><strong>)</strong>&#58;

    - Позволяет добавлять дополнительную функциональность объектам динамически.

    - Декоратор оборачивает объект с тем же интерфейсом и добавляет поведение до или после делегирования вызова. Методы расширения сами по себе этот паттерн не реализуют.

:::note[Ссылки для изучения]

1. [Паттерны проектирования в C#](https://habr.com/ru/articles/191934/)
   :::
