Библиотека собеса по C# | вопросы с собеседований
5.5K subscribers
244 photos
4 videos
1 file
383 links
Вопросы с собеседований по C# и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/4c2f1c3b

Для обратной связи: @proglibrary_feeedback_bot

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Какой синтаксис нужно использовать в C# для отлова любого возможного исключения?

Блок catch, отлавливающий исключения типа System.Exception. Также можно просто использовать catch{}, не указывая тип исключения.

Библиотека собеса по С#
В чём разница между IEnumerable, ICollection и IList в C# и когда стоит использовать каждый из них?

IEnumerable — только перебор коллекции (итерация, LINQ).

ICollection — добавляет информацию о размере и методы добавления/удаления элементов.

IList — упорядоченная коллекция с доступом по индексу.

Использовать стоит в зависимости от требований: для readonly-итераций — IEnumerable, для работы с изменяемыми коллекциями — ICollection, а если нужен доступ по индексу — IList.

Библиотека собеса по С#
👍4
Что такое IDisposable и как работает using в C#?

IDisposable определяет метод Dispose(), который освобождает неуправляемые ресурсы (файлы, соединения, хэндлы).
using гарантирует вызов Dispose() даже при исключении, фактически это синтаксический сахар для try/finally.


Библиотека собеса по С#
2
В ASP.NET Core под нагрузкой растёт хвост задержек: CPU низкий, но наблюдаются пики длины очереди ThreadPool и таймауты HttpClient. Где искать корень проблемы и как её устранить?

Это типичный признак thread pool starvation из-за sync-over-async: блокировки .Result/.Wait(), синхронные I/O или тяжёлая синхронная работа в request-потоках. Диагностика — EventCounters/PerfView (ThreadPool QueueLength, Contentions), анализ async-стека. Решение — сделать путь запроса полностью асинхронным (DB/HTTP/FS), убрать блокировки, вынести CPU-bound в Task.Run/фоновые очереди, корректно использовать HttpClientFactory, и как временную меру — поднять ThreadPool.SetMinThreads.

Библиотека собеса по С#
🔥21
🔥 Последняя неделя перед стартом курса по AI-агентам

Старт курса уже 15го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место

На курсе:
разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах

📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями

И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»

Промокод на 5.000₽: LASTCALL

👉 Курс здесь
🥱21
В ASP.NET Core сервисе растёт хвост задержек и паузы GC. Профилировщик показывает миллионы аллокаций byte[]/MemoryStream в сети/серилизации на горячем пути. Как перепроектировать ввод/вывод, чтобы сделать его low-alloc/почти zero-copy, и какие подводные камни учесть?

Перейти на System.IO.Pipelines (PipeReader/PipeWriter) и парсинг через ReadOnlySequence<byte>/SequenceReader<byte>; писать в IBufferWriter<byte> вместо конкатенаций и ToArray(). Временные буферы брать из ArrayPool<byte>/MemoryPool<byte> (IMemoryOwner<byte>) и возвращать в finally. Не удерживать Span<T> через await (переносить как Memory<T>), уважать backpressure (AdvanceTo, FlushAsync), ограничивать параллелизм. Минимизировать boxing/LINQ на горячем пути, использовать source-generated сериализацию. Проверить ETW/EventCounters и бенчмарки, валидировать, что аллокации и tail-latency упали.

Библиотека собеса по С#
7
В чем разница между Task и Thread в C#?

Ниже приведены различия между Task и Thread в C#:

Task — это объект, используемый в Task Parallel Library (TPL) для представления асинхронной операции, в то время как Thread — это отдельный путь выполнения в программе. Задачи — это более высокий уровень абстракции, чем потоки, и используются для управления параллельным выполнением кода.

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


Библиотека собеса по С#
Долгоживущий .NET-сервис постепенно “распухает” по памяти без явных LOH-пиков. В дампе видно множество делегатов/лямбд, Timer и CancellationTokenRegistration, висящих в Gen2. Как диагностировать и устранить утечки из-за событий/таймеров/регистраций?

Проанализировать пути до корней (dotMemory/PerfView/dotnet-dump gcroot) — проверить коллекции подписчиков и списки делегатов у источников событий. Убедиться, что:

✍🏻 все подписки снимаются в Dispose/IAsyncDisposable;
✍🏻 CancellationToken.Register хранит IDisposable и корректно Dispose();
✍🏻 Timer/PeriodicTimer/System.Threading.Channels закрываются/завершаются;
✍🏻 не удерживаются замыканиями большие объекты/this.

При необходимости — слабые события/WeakReference, паттерн “own the lifetime”, и тест “утечек” в CI с сравнением heap-снимков.


Библиотека собеса по С#
Напишите особенности обобщений на C#?

Generics — это метод, который улучшает ваши программы во многих отношениях, например: Он помогает вам в повторном использовании кода, производительности и безопасности типов. Вы можете создавать собственные универсальные классы, методы, интерфейсы и делегаты. Вы можете создавать универсальные классы коллекций. Библиотека классов .NET Framework содержит много новых универсальных классов коллекций в пространстве имен System.Collections.Generic. Вы также можете получить информацию о типах, используемых в универсальных типах данных во время выполнения.

Библиотека собеса по С#
🥱2😢1
Какие гарантии и ограничения даёт lock в C# при работе с многопоточностью?

Короткий ответ: обеспечивает взаимное исключение по одному и тому же объекту и полные барьеры памяти (acquire на входе, release на выходе; «happens-before» между секциями по тому же объекту), но не гарантирует справедливость/очередность, не предотвращает дедлоки и не синхронизирует потоки, использующие разные объекты.

Библиотека собеса по С#
У вас в ASP.NET Core есть эндпоинт, который стримит данные клиенту. Под нагрузкой память растёт, клиенты часто обрывают соединение. Что сделать?

Не копите всё в памяти: сделайте ограниченную очередь (Channel.CreateBounded), отправляйте по мере готовности (await foreach с RequestAborted), пишите потоково в ответ (Response.BodyWriter), а не собирайте большие буферы.

Библиотека собеса по С#