P
prepair.app
Пройти інтерв'ю →
EnglishУкраїнськаРусскийDeutsch
🟣

Питання на співбесіді .NET

Співбесіда з .NET іде на двох рівнях: сама мова C# і рантайм під нею — CLR, збирач сміття, те, як насправді працює async/await, — а далі переходить до ASP.NET Core та Entity Framework Core, де живе більшість прикладних питань. Нижче питання, які ставлять найчастіше, кожне з еталонною відповіддю.

Junior · без досвіду / до 1 рокуMiddle · 2–4 роки досвідуSenior · 5+ років досвіду

Що запитують

Типи C#, LINQ і nullable reference types
Async/await і модель Task
CLR, JIT і збирання сміття
ASP.NET Core: middleware і dependency injection
Entity Framework Core і продуктивність запитів
Тестування на xUnit/Moq, Docker і деплой у хмару

9 реальних питань з відповідями

До кожного питання — еталонна відповідь, з якою можна порівняти свою.

1

Чим відрізняється value type від reference type у C#?

Відповідь

Value type (struct, int, bool, enum) зберігає дані напряму і копіюється під час присвоєння; reference type (class, string, масиви) зберігає вказівник на дані в купі, і при присвоєнні копіюється вказівник, а не сам обʼєкт. Передавання структури в метод, який її змінює, мовчки працює з копією, якщо не передати її через ref. Структура, що зберігається в полі класу, лежить у купі разом із ним, а не на стеку.

2

Що таке boxing і unboxing і чому це важливо для продуктивності?

Відповідь

Boxing загортає value type в обʼєкт у купі, щоб з ним можна було працювати як з object, — наприклад, передати int туди, де очікується object, або в нетипізований ArrayList. Unboxing приводить його назад і копіює значення. Кожен box — це виділення памʼяті в купі й кандидат для збирача сміття, тому цикл, що боксить мільйони int, створює реальне навантаження на GC, якого дженерики повністю уникають.

3

Яку проблему вирішують nullable reference types?

Відповідь

До C# 8 string name і значення, яке могло бути null, виглядали однаково, тому компілятор не міг попередити, що метод, який повернув null, вибухне трьома викликами пізніше. З увімкненими nullable reference types string означає «ніколи не null», а string? — «може бути null», і компілятор попереджає при розіменуванні ?-типу без перевірки. Гарантії на рівні рантайму це не дає, але переводить більшість null-багів у попередження компіляції замість NullReferenceException о другій ночі.

4

Що означає, що виконання LINQ-запиту відкладене?

Відповідь

var query = users.Where(u => u.Active) не чіпає дані — будується конвеєр, який виконується, коли ви його перебираєте через foreach, .ToList(), .Count() тощо. Тому та сама змінна запиту може повернути різні результати, якщо вихідна колекція змінилася між побудовою і перебором, а виклик .ToList() зарано вбиває подальшу фільтрацію, тоді як запізнілий виклик на IQueryable означає повторний похід у базу за кожного перебору.

5

Що насправді відбувається при `await` для `Task`?

Відповідь

Компілятор переписує метод у скінченний автомат: код до await виконується синхронно, а якщо очікувана задача ще не завершена, метод одразу повертає керування виклику, звільняючи потік. Коли задача завершується, продовження відновлюється — за замовчуванням у захопленому SynchronizationContext в UI-застосунках, тому ConfigureAwait(false) у бібліотечному коді рятує від дедлоків. async не означає «виконується в іншому потоці» — це означає «не блокує потік під час очікування».

6

Що таке покоління збирача сміття і навіщо вони рантайму?

Відповідь

CLR групує обʼєкти в покоління 0, 1 і 2, виходячи зі спостереження, що більшість обʼєктів помирають молодими — DTO в межах запиту стає сміттям за мілісекунди, а закешований конфіг живе весь час роботи застосунку. Збирання gen 0 дешеві й часті; той, що вижив, підвищується до gen 1, потім до gen 2, а збирання gen 2 сканують усю живу купу і коштують дорого. Обʼєкти від 85 000 байт одразу потрапляють у Large Object Heap, який збирається разом із gen 2 і за замовчуванням не дефрагментується.

7

Опишіть конвеєр middleware в ASP.NET Core.

Відповідь

Кожен запит проходить через middleware, зареєстровані в Program.cs, у порядку додавання — зазвичай обробка винятків, редирект на HTTPS, роутинг, автентифікація, авторизація, потім ендпоінт. Кожен middleware може діяти до виклику next(), після або і те, і те, і може обірвати ланцюг, узагалі не викликавши next(), — так автентифікація відхиляє запит до контролера. Порядок не косметика: авторизація до роутингу означає, що ще немає знайденого ендпоінта для перевірки політик, і це кидає виняток.

8

Коли Entity Framework Core спричиняє проблему N+1 і як її лагодити?

Відповідь

Завантаження списку замовлень, а потім звернення до order.Customer.Name усередині foreach без попереднього завантаження робить по запиту на кожне замовлення — той самий N+1, що й у будь-якому ORM. Include(o => o.Customer) лагодить це через JOIN, а AsSplitQuery() — коли join розмножив би рядки через кілька включених колекцій. Відстеження змін — суміжна вартість: EF Core робить знімок кожної відстежуваної сутності для виявлення змін під час SaveChanges(), що марно для списку лише на читання, тому для читання потрібен AsNoTracking().

9

Чим різняться вбудовані часи життя DI — Transient, Scoped і Singleton?

Відповідь

Transient створює новий екземпляр за кожного запиту. Scoped створює один екземпляр на HTTP-запит і перевикористовує його до кінця цього запиту. Singleton створює один екземпляр на весь час життя застосунку. Класична помилка — впровадити scoped-сервіс, наприклад DbContext, у singleton: він захоплює scoped-екземпляр першого запиту й тримає його вічно, що або падає за наступного використання, або непомітно розшарює стан між непов’язаними запитами.

🦎

Прочитати відповіді недостатньо

На співбесіді ти говориш вголос під тиском. Кем поставить ті самі питання, оцінить кожну відповідь і покаже, що саме підтягнути.

Пройти інтерв'ю .NET Backend Developer →
Безкоштовно · 3 інтерв'ю на місяць

Варто прочитати

Всі статті →

Інші спеціалізації

🔍QA Manual🤖QA AutomationJava Backend🐍Python Backend🐘PHP Backend🦫Go Backend🟢Node.js Backend💎Ruby on Rails🔷C++🟨JavaScript⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js🍏iOS (Swift)🟩Android (Kotlin)📱React Native Developer⚙️DevOps / SRE🗄️Data Engineer🧠AI/ML Engineer📊Data Scientist📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing🧑‍💼HR / Recruiter🤝Sales / Account Manager🎧Technical Support Engineer