Вопросы на собеседовании: C#
Реальные вопросы с C#/.NET-собеседований: от boxing и структур до async/await и сборки мусора — с примерами, которые можно запустить.
Курс «Вопросы на собеседовании: C#» состоит из 5 разделов и 15 уроков: Типы и память, ООП в C#, Коллекции и LINQ, Асинхронность и CLR и подводные камни. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Типы и память
- Типы значений и ссылочные типы
Что выведет код, если изменить объект внутри метода? Разбираем value type и reference type, стек и кучу, ref/out/in и ловушку со string.
- Boxing и unboxing
Что такое упаковка значимого типа в object, сколько она стоит в памяти и где происходит незаметно: ArrayList, string.Format, интерфейсы. Разбор с кодом.
- struct или class: что выбрать
Чем struct отличается от class в C#: семантика, память, значения по умолчанию. Почему мутабельные структуры опасны и когда struct действительно оправдан.
- Типы значений и ссылочные типы
2 ООП в C#
- Интерфейс или абстрактный класс
Когда выбирать интерфейс, а когда абстрактный класс в C#: множественная реализация, явная реализация и default-методы интерфейсов из C# 8 с примерами кода.
- virtual, override и new: что выведет код
virtual, override и new в C#: что на самом деле выведет код, как работает позднее связывание, чем сокрытие метода отличается от переопределения и где ловушка.
- Свойства, автосвойства и инкапсуляция
Свойства и поля в C#: get/set и их модификаторы, автосвойства, init-only из C# 9, инкапсуляция и почему публичные поля — плохая практика. С разбором кода.
- Интерфейс или абстрактный класс
3 Коллекции и LINQ
- Как устроены List и Dictionary
Собеседование по C#: динамический массив с удвоением ёмкости, хеш-таблица и роль GetHashCode, сложность операций и выбор коллекции под задачу.
- LINQ и отложенное выполнение
Вопрос с собеседования по C#: почему LINQ-запрос не выполняется, пока его не перечислили, чем опасно многократное перечисление и зачем нужен ToList().
- IEnumerable против IQueryable
Вопрос с собеседования по C#: чем IQueryable отличается от IEnumerable, где выполняется фильтрация — в базе или в памяти, и что такое деревья выражений.
- Как устроены List и Dictionary
4 Асинхронность
- async/await под капотом
Что компилятор C# делает с async-методом, почему async не значит «в другом потоке», как работает машина состояний и контекст синхронизации.
- Task против Thread
Чем Task отличается от Thread в C#: пул потоков, Task как абстракция над работой, когда нужен Task.Run и почему асинхронный ввод-вывод не занимает поток.
- Deadlock и ConfigureAwait
Почему .Result и .Wait() вешают приложение в UI и ASP.NET: механика классического deadlock, роль ConfigureAwait(false) и правило «async всю дорогу».
- async/await под капотом
5 CLR и подводные камни
- Сборка мусора и поколения
Поколения 0/1/2, почему GC в .NET быстрый, что такое Large Object Heap и как в управляемом коде возникает утечка памяти через подписку на событие.
- IDisposable и using
IDisposable в C#: неуправляемые ресурсы, детерминированное освобождение, во что компилятор разворачивает using, полный паттерн Dispose и почему финализатор его не заменяет.
- == , Equals и GetHashCode
Почему == для строк работает по значению, а для object — по ссылке, в чём контракт Equals и GetHashCode и что именно ломается в Dictionary, если его нарушить.
- Сборка мусора и поколения