Вопросы по C# и .NET
Типы значений и ссылки, коллекции и LINQ, async/await, потоки, GC, ASP.NET Core и EF Core: всё, что спрашивают на собесе .NET-разработчика от junior до senior. После трека вы объясняете, что происходит под капотом, и уверенно предсказываете вывод хитрого кода.
Проверьте себя: тест по C# и .NET
20 вопросов, 10 минут, уровень junior, middle или senior
Типы значений и ссылочные
struct и class, стек и куча, boxing, Nullable, record и передача параметров.
Урок: Типы значений и ссылочные типы 7 мин- Что такое boxing и unboxing
- Сравнение двух упакованных чисел через ==
- Когда происходит упаковка
- Переприсваивание параметра-класса
- default и конструктор структуры без параметров
- Число различных точек
- Сумма int с переполнением, как в unchecked
- Среднее с пропусками (int?)
Ещё 14 вопросов и задач
- Модификаторы параметров и их смысл
- Арифметика с int?
- Изменение упакованной структуры
- Изменение структуры в списке и массиве
- record и выражение with
- Защитная копия у readonly-поля структуры
- record class и record struct
- Равенство record
- Разница ref, out и in
- Стек и куча в .NET
- Когда выбрать struct, а когда class
- Присваивание структуры копирует данные
- Типы значений и ссылочные типы: главное
- Где хранится поле-структура внутри класса
Строки
Неизменяемость, интернирование, StringBuilder, сравнение и культуры, интерполяция.
Урок: Строки в C# 6 мин- Как правильно сравнивать строки без учёта регистра
- Ordinal и культурное сравнение строк
- Почему += в цикле медленно
- Словарь с ключами без учёта регистра
- Почему строки неизменяемы
- Что делает Replace со строкой
- Интернирование литералов
- Интерполяция строк в .NET 6+
Ещё 15 вопросов и задач
- Пары анаграмм
- Палиндром без учёта регистра и знаков
- Слова в обратном порядке
- Сжатие строки RLE
- Самые частые слова
- Проверка строки на пустоту
- Строки, приведённые к object
- StringBuilder: Insert, Remove, Replace
- Строки: ==, Equals и ссылки
- Split с пустыми элементами
- Подстроки без аллокаций
- Как сравнивать строки в C#
- Строки и производительность
- Когда StringBuilder не нужен
- Длина строки с эмодзи
ООП в C#
Классы и интерфейсы, virtual, override и new, абстрактные классы, модификаторы доступа.
Урок: ООП в C# 7 мин- Абстрактный класс или интерфейс
- protected internal и private protected
- Методы интерфейса по умолчанию
- Явная реализация интерфейса
- Банковские счета: инкапсуляция и инварианты
- Фигуры: полиморфная площадь
- Чем new отличается от override
- new и override при вызове через базовый тип
Ещё 12 вопросов и задач
- Порядок инициализации при создании наследника
- Порядок статических и обычных конструкторов
- Статическое поле общее для всех объектов
- virtual, override и new в цепочке
- Принципы ООП на примерах C#
- Зачем sealed
- Принцип подстановки Лисков
- Композиция или наследование
- SOLID на примерах из .NET
- static abstract члены интерфейсов
- Когда вызывается статический конструктор
- Вызов виртуального метода из конструктора
Коллекции и LINQ
List, Dictionary, HashSet изнутри, IEnumerable и IQueryable, отложенное выполнение LINQ.
Урок: Коллекции и LINQ 8 мин- Какую коллекцию выбрать
- Удаление из List в foreach
- Отложенное выполнение LINQ
- Отложенные и немедленные операторы LINQ
- Сложность поиска в Dictionary
- First, Single и их OrDefault
- FrozenDictionary в .NET 8
- GroupBy против ToLookup
Ещё 20 вопросов и задач
- Контракт Equals и GetHashCode
- IEnumerable и IQueryable
- Средняя зарплата по отделам (GroupBy)
- Уникальные слова без учёта регистра с сохранением порядка
- Остатки на складе
- Пользователи и заказы: LEFT JOIN в памяти
- LRU-кеш
- Слияние интервалов
- k самых частых чисел
- Два числа с заданной суммой
- Как растёт List<T>
- Сложность операций коллекций
- Повторное перечисление IEnumerable
- Изменяемый ключ в HashSet
- Отложенный LINQ и изменённая переменная
- Стабильная сортировка OrderBy
- Побочные эффекты в Select
- Как устроен Dictionary изнутри
- LINQ и производительность
- Когда выполняется тело метода с yield
Делегаты и события
Func и Action, мультикаст-делегаты, лямбды и замыкания, event и утечки подписок.
Урок: Делегаты, лямбды и события 6 мин- Как компилятор реализует замыкание
- Замыкание на переменную цикла for
- Утечка памяти через событие
- Чем event отличается от поля-делегата
- Стандартный шаблон события
- Исключение в одном из подписчиков
- Объявление и вызов события
- Func, Action и Predicate
Ещё 11 вопросов и задач
- Безопасный вызов события
- Конвейер операций из делегатов
- Подписки на темы: события и отписка
- Что возвращает мультикаст-делегат
- Счётчик на замыкании
- Добавление и удаление методов в делегате
- Замыкания в C#
- События, колбэки и их альтернативы
- Аллокации лямбд и static-лямбды
- Как избежать утечки через подписки
- Что такое делегат
Дженерики
Ограничения where, ковариантность и контравариантность, статические поля в дженериках.
Урок: Дженерики 6 мин- Ограничение на интерфейс
- Ограничение new()
- Виды ограничений where
- Контравариантность Action<in T>
- Ковариантность IEnumerable<out T>
- default(T)
- Обобщённая математика .NET 7
- Слияние k отсортированных списков через PriorityQueue
Ещё 9 вопросов и задач
Исключения
try, catch, finally, throw против throw ex, фильтры when, свои исключения и using.
Урок: Исключения 6 мин- AggregateException и await
- Порядок блоков catch
- Своё исключение
- ExceptionDispatchInfo
- Исключения как управление потоком
- Фильтры исключений when
- return в try и finally
- Глобальная обработка ошибок в ASP.NET Core
Ещё 11 вопросов и задач
- Стандартные исключения и когда их бросать
- Калькулятор с обработкой ошибок
- Валидация строк импорта без исключений
- Порядок обработки исключения
- Порядок try, catch и finally
- Фильтры when и порядок вычисления
- finally, using и освобождение ресурсов
- Стратегия обработки ошибок в сервисе
- Какие исключения нельзя поймать
- throw против throw ex
- using и исключения
async/await и Task
Машина состояний, SynchronizationContext, ConfigureAwait, ValueTask, отмена и дедлоки.
Урок: async/await и Task 8 мин- Отмена через CancellationToken
- Зачем ConfigureAwait(false)
- Дедлок из-за .Result
- IAsyncEnumerable
- Асинхронные API и их назначение
- await уже завершённой задачи
- Синхронная часть async-метода
- Исключения из Task.WhenAll
Ещё 11 вопросов и задач
- Как работает async/await под капотом
- Типичные ошибки с async/await
- Во что компилируется async-метод
- Sync over async и async over sync
- Task.Run в ASP.NET Core
- Task и Thread
- TaskCompletionSource и синхронные продолжения
- Создаёт ли await новый поток
- Когда ValueTask, а когда Task
- Чем опасен async void
- Последовательно или параллельно
Потоки и синхронизация
Thread и ThreadPool, lock, Interlocked, SemaphoreSlim, конкурентные коллекции, volatile.
Урок: Потоки и синхронизация 7 минGC, IDisposable и производительность
Поколения, LOH, финализаторы, Dispose-паттерн, Span, stackalloc, ArrayPool.
Урок: GC, IDisposable и производительность 8 мин- ArrayPool и аренда буферов
- Где выделит память лямбда в цикле
- Зачем GC.SuppressFinalize в Dispose
- Шаблон Dispose
- Финализатор и сборка мусора
- Корни сборщика мусора
- Поколения сборщика мусора
- Когда реализовывать IDisposable
Ещё 11 вопросов и задач
- Быстрый разбор большого ввода
- FizzBuzz с быстрым выводом
- Свой wc: строки, слова, максимальная длина
- Утечки памяти в управляемом коде
- Куча больших объектов
- Порядок вызова Dispose
- Server GC и Workstation GC
- Span<T> и Memory<T>
- Почему Span<T> нельзя хранить в поле класса
- Как снизить аллокации в горячем коде
- Как работает сборщик мусора .NET
ASP.NET Core
Конвейер middleware, DI и время жизни сервисов, контроллеры и minimal API, конфигурация.
Урок: ASP.NET Core 8 мин- Фоновая работа в ASP.NET Core
- Scoped внутри Singleton
- Время жизни сервисов в DI
- Почему не new HttpClient на каждый запрос
- Трассировка конвейера middleware
- Маршрутизатор как в ASP.NET Core
- Что проверять в JWT
- Keyed services в .NET 8
Ещё 12 вопросов и задач
- Singleton, Scoped, Transient
- Порядок middleware
- Minimal API и контроллеры
- Откуда берутся параметры в контроллере
- IOptions, IOptionsSnapshot и IOptionsMonitor
- Порядок middleware в Program.cs
- Output caching в .NET 7+
- Типичный порядок middleware
- Код-ревью безопасности: вход и профиль
- Внедрение зависимостей в ASP.NET Core
- Путь HTTP-запроса в ASP.NET Core
- Use, Run и Map
EF Core
DbContext, отслеживание изменений, N+1 и загрузка связей, миграции, транзакции и конкурентность.
Урок: EF Core без сюрпризов 8 мин- Зачем AsNoTracking
- Состояния сущности в трекере
- Оптимистичная конкурентность
- Пул контекстов и скомпилированные запросы
- Время жизни DbContext
- ExecuteUpdate и ExecuteDelete
- Декартов взрыв при нескольких Include
- Где выполняется фильтр
Ещё 11 вопросов и задач
- Трекер изменений своими руками
- Способы загрузки связанных данных
- Состояние сущности и SQL при SaveChanges
- Применение миграций в продакшене
- Проблема N+1
- Отложенный запрос и повторное перечисление
- Сырой SQL и инъекции
- Код-ревью: эндпоинт заказов на EF Core
- Что делает SaveChanges
- Как найти и исправить N+1 в EF Core
- Трекер изменений EF Core
Тестирование
xUnit, моки, интеграционные тесты с WebApplicationFactory, тестовые базы и пирамида.
Урок: Тестирование в .NET 6 мин