C# / .NET задачи и вопросы – Telegram
C# / .NET задачи и вопросы
1.57K subscribers
358 photos
3 files
248 links
🎲 Задачи и вопросы с собеседований по .Net/C# разного уровня сложности.

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Обсуждаем тут: @netquizcom
Download Telegram
Чем IQueryable отличается от IEnumerable?

👾 — IQueryable всегда быстрее и работает только в памяти
👍 — IQueryable строит дерево выражений для провайдера и может выполняться удалённо (БД); IEnumerable перечисляет в памяти
🥰 — Они идентичны; различий нет
⚡️ — IEnumerable поддерживает async, а IQueryable — нет

Библиотека задач по C#
👍8
Чем опасен Task.Factory.StartNew по сравнению с Task.Run для offload CPU?

👾 — Он всегда запускает работу в новом процессе
👍 — Наследует TaskScheduler.Current, не разворачивает вложенные задачи, часто требует опций/Unwrap; для фоновой работы предпочтителен Task.Run (ThreadPool, подходящие опции)
🥰 — Он быстрее и безопаснее во всех случаях
⚡️ — Он автоматически применяет ConfigureAwait(false)

Библиотека задач по C#
👍3
Что произойдет, если попытаться присвоить значение переменной readonly вне конструктора?

👾 — Ошибка компиляции
👍 — Ошибка выполнения
🥰 — Переменная будет изменена
⚡️ — Переменная станет null

Библиотека задач по C#
Как сделать «асинхронный lock» вокруг критической секции?

👾 — lock работает через await
👍 — await semaphore.WaitAsync() с SemaphoreSlim(1, 1) и try/finally Release()
🥰 — Monitor.Enter/Exit поддерживает await
⚡️ — Interlocked гарантирует эксклюзивный доступ ко всей секции

Библиотека задач по C#
Как логировать в Microsoft.Extensions.Logging с минимумом аллокаций на горячем пути?

👾 — Интерполяция строк: $"User {id} logged in"
👍 — LoggerMessage.Define/DefineScope с кэшированными делегатами (структурированное логирование)
🥰 — Console.WriteLine — самый лёгкий вариант
⚡️ — Создавать новый EventSource на каждое сообщение

Библиотека задач по C#
👍2
Чем BackgroundService отличается от IHostedService?

👾 — Предназначен только для таймеров
👍 — Это базовый класс с циклом ExecuteAsync; IHostedService — лишь интерфейс Start/Stop без цикла
🥰 — Запускается только в Debug
⚡️ — Не поддерживает отмену CancellationToken

Библиотека задач по C#
👍3
Что верно про BackgroundService в .NET?

👾 — Это таймер, который сам перезапускает приложение при сбое
👍 — Базовый класс для IHostedService: реализуете долгоживущую работу в ExecuteAsync(CancellationToken), отмена через stoppingToken
🥰 — Запускается только по расписанию Cron
⚡️ — Обязателен в ASP.NET Core для всех контроллеров

Библиотека задач по C#
👍4
Что вызовет await using у типа, реализующего и IDisposable, и IAsyncDisposable?

👾 — Сначала Dispose(), затем DisposeAsync()
👍 — Только DisposeAsync()
🥰 — Только Dispose()
⚡️ — Зависит от JIT, случайный выбор

Библиотека задач по C#
Что делает await Task.Yield()?

👾 — Переносит работу на отдельный поток пула
👍 — Отдаёт управление планировщику и асинхронно продолжит после yield (в текущем контексте, если он есть); не offload’ит работу
🥰 — Усыпляет поток на один квант
⚡️ — Гарантирует переключение на UI-поток

Библиотека задач по C#
👍1
Что означает ref readonly возврат из метода?

👾 — Можно присвоить новое значение через эту ссылку
👍 — Это ссылка только для чтения на исходные данные; запись запрещена, нельзя возвращать ссылку на временный
🥰 — Это обычная копия значения на стеке
⚡️ — Разрешено только для struct

Библиотека задач по C#
В .NET вы видите, что приложение часто вызывает сборку мусора, из-за чего падает производительность. Какой из подходов наиболее правильный для снижения давления на GC?

👾 — Хранить все объекты в глобальных переменных, чтобы их не собирал GC
👍 — Использовать пулы объектов (ArrayPool, ObjectPool) и Span, чтобы сократить количество аллокаций
🥰 — Вручную вызывать GC.Collect() после каждой тяжёлой операции
⚡️ — Перейти на dynamic для универсальности и уменьшения числа классов

Библиотека задач по C#
В .NET приложении необходимо обрабатывать миллионы строк текста с минимальными расходами памяти и максимальной скоростью. Какой подход будет наиболее правильным?

👾 — Использовать string конкатенацию (+) в цикле
👍 — Применить StringBuilder для конкатенации строк
🥰 — Сохранять строки в List и объединять их через string.Join
⚡️ — Использовать Span или Memory для работы с подстроками без создания новых объектов

Библиотека задач по C#
Можно ли запретить наследование от своего собственного класса?

Для того, чтобы запретить наследоваться от класса необходимо объявить его с модификатором sealed.
Является ли C# типобезопасным языком программирования?

👾 — Да
⚡️ — Нет

Библиотека задач по C#
🎉3
Что выведет код?

👾 — Wed
👍 — 3
🥰 — 2
⚡️ — 4

Библиотека задач по C#
👍5
В .NET приложении необходимо обрабатывать миллионы строк текста с минимальными расходами памяти и максимальной скоростью. Какой подход будет наиболее правильным?

👾 — Использовать string конкатенацию (+) в цикле
👍 — Применить StringBuilder для конкатенации строк
🥰 — Сохранять строки в List и объединять их через string.Join
⚡️ — Использовать Span или Memory для работы с подстроками без создания новых объектов

Библиотека задач по C#
👍3
Решать задачи — хорошо. Понимать суть — бесценно

Можно бесконечно гонять задачи на LeetCode, но без фундаментального понимания алгоритмов и паттернов ты просто запоминаешь решения, а не учишься мыслить инженерно.

Акция 1 + 2:

Забирай три курса по цене одного. Оплачиваешь самый дорогой слот, два других получаешь бесплатно.

Идеальный стек для практики:

— Алгоритмы и структуры данных (база);
— Архитектуры и шаблоны проектирования.

Прокачать скиллы (https://clc.to/ThuFyQ)

До 31 декабря.
Помощь с выбором: @manager_proglib (https://news.1rj.ru/str/manager_proglib)
У вас есть сервис на .NET, обрабатывающий большое количество параллельных запросов к базе данных. При нагрузочном тестировании вы замечаете, что количество потоков резко растёт, а производительность падает. Какой подход будет наиболее правильным для оптимизации?

👾 — Использовать Task.Run вокруг всех вызовов к базе, чтобы явно распараллелить операции
👍 — Применить асинхронный доступ к базе данных (async/await) с использованием I/O-bound операций
🥰 — Увеличить ThreadPool.SetMinThreads, чтобы обрабатывать больше потоков одновременно
⚡️ — Переписать сервис на синхронный код, чтобы избежать overhead от async/await

Библиотека задач по C#
👍1
В .NET у вас есть метод, который вызывается в высоконагруженном сервисе миллионы раз в секунду. В профилировании видно, что он активно генерирует мусор, перегружая GC. Какой из подходов будет наиболее правильным для оптимизации?

👾 — Переписать метод на небезопасный код (unsafe) и работать напрямую с указателями
👍 — Использовать Span и пулы объектов (ArrayPool, ObjectPool) для снижения количества аллокаций
🥰 — Увеличить размер heap в настройках CLR, чтобы GC срабатывал реже
⚡️ — Запустить несколько экземпляров метода параллельно, чтобы распределить нагрузку на разные потоки

Библиотека задач по C#
👍1
В высоконагруженном .NET сервисе вы часто работаете со строками: конкатенация, парсинг, подстроки. Профилирование показывает большое количество аллокаций и нагрузку на GC. Какой подход будет наиболее правильным для оптимизации?

👾 — Использовать обычный оператор + для конкатенации строк — компилятор сам оптимизирует
👍 — Применить StringBuilder для конкатенации и Span/Memory для работы с подстроками без копирования
🥰 — Перейти на dynamic, чтобы уменьшить количество перегрузок
⚡️ — Вызывать GC.Collect() вручную после больших операций со строками

Библиотека задач по C#