Библиотека собеса по C# | вопросы с собеседований
5.58K subscribers
267 photos
6 videos
1 file
563 links
Вопросы с собеседований по C# и ответы на них.

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Можно ли вызывать Unity API из Job System/дополнительных потоков и как правильно применить параллельно посчитанные результаты к объектам сцены?

Нельзя: UnityEngine.Object и большинство API — только с главного потока. Параллелим расчёты на NativeArray/NativeSlice/NativeHashMap (без managed-ссылок), помечаем [ReadOnly]/[WriteOnly], включаем Burst, Schedule/ScheduleParallel, сохраняем JobHandle, затем на главном потоке делаем Complete() и читаем Native*, применяя значения к Transform/Mesh в Update/LateUpdate. Контейнеры реюзаем с Allocator.Persistent, не аллоцируем каждый кадр.

Библиотека собеса по С#
👍1
Что делает lock(obj) под капотом и почему плохая идея — блокировать this или строку?

Компилятор разворачивает в try { Monitor.Enter(obj); } finally { Monitor.Exit(obj); }, монитор реентерабелен и висит на объекте. Блокировка this/публичных объектов/строк опасна: внешний код может их тоже залочить (строки интернируются) → риск дедлоков и лишнего контеншна.

Библиотека собеса по С#
2
Объясните, что реально происходит при async/await в C#: как компилятор трансформирует метод, как выбирается поток для продолжения, что делает ConfigureAwait(false), и почему в UI/старом ASP.NET ловят дедлок при .Result/.Wait().

Компилятор разворачивает метод в IAsyncStateMachine: локальные и позиция сохраняются в полях, await берёт awaiter (обычно TaskAwaiter) и через OnCompleted/UnsafeOnCompleted регистрирует продолжение. По умолчанию продолжение постится в текущий SynchronizationContext (если он есть), иначе — в TaskScheduler.Current (обычно пул потоков). ConfigureAwait(false) отключает захват контекста, поэтому продолжение уходит в пул и не требует возвращения в UI-контекст. Дедлок появляется, когда однопоточный контекст (WinForms/WPF или классический ASP.NET) блокируется .Result/.Wait(), а продолжение пытается вернуться в тот же контекст, который занят блокирующим ожиданием; ни то ни другое не сдвигается. Лекарство: не блокировать асинхронщину (“async all the way”), в библиотечном коде использовать ConfigureAwait(false) там, где не нужен контекст, и передавать CancellationToken.

Библиотека собеса по С#
8
Зачем Span<T> сделан ref struct, где его нельзя использовать, и когда вместо него брать Memory<T>?

Span<T> — ref struct, чтобы не «утекать» на кучу: его нельзя хранить в полях классов, боксить, захватывать в лямбды/итераторы/async-стейтмашины; он должен жить только в текущем синхронном фрейме (часто ссылается на стек/неуправляемую память). Для долгоживущих/асинхронных сценариев берут Memory<T>/ReadOnlyMemory<T> (они heap-safe) и при необходимости получают краткоживущий Span через .Span.

🐸Библиотека собеса по С#
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Когда использовать StringBuilder предпочтительнее, чем string?

StringBuilder предпочтительнее использовать, если строка часто изменяется.

🐸Библиотека собеса по С#
Please open Telegram to view this post
VIEW IN TELEGRAM
😁42
Как используются делегаты в C#?

Делегаты имеют несколько применений. Некоторые из них — механизм обратного вызова, многоадресная рассылка, асинхронная обработка, а также методы абстрагирования и инкапсуляции.

Библиотека собеса по С#
Когда использовать StringBuilder предпочтительнее, чем string?

StringBuilder предпочтительнее использовать, если строка часто изменяется.

🐸Библиотека собеса по С#
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
Когда выбирать ValueTask вместо Task и какие у него подводные камни?

Используй ValueTask только в «горячих» путях, где операция очень часто завершается синхронно и ты реально избегаешь аллокации Task; во всех прочих случаях — Task проще и безопаснее. Ограничения: ValueTask — struct, легко копируется и раздувает захваты в замыканиях; его можно корректно ожидать лишь один раз (если источник — IValueTaskSource), для повторных ожиданий/комбинаторов сначала делай AsTask(); неверное повторное ожидание ведёт к гонкам/исключениям; AP

Библиотека собеса по С#
4
В чем разница между переменными объектного типа и переменными динамического типа в C#?

Динамические и объектные переменные имеют схожую функцию. Переменные объектного типа проверяют тип во время компиляции, тогда как динамические переменные — во время выполнения.

🐸Библиотека собеса по С#
Please open Telegram to view this post
VIEW IN TELEGRAM
1
В вашей команде разработчиков часто случаются конфликты при merge в main. Как вы будете диагностировать и выстраивать процесс так, чтобы минимизировать количество конфликтов?

Анализировать, где чаще всего возникают конфликты (монолитные файлы, частые изменения), внедрить короткоживущие feature-ветки и регулярные rebase на main, настроить code ownership и pull request review. При необходимости — разбить большие модули на более мелкие, а также автоматизировать форматирование кода, чтобы уменьшить “шум” в diff.

Библиотека собеса по С#
2
Как бы вы объяснили разницу между Repeater и ListView?

Элемент управления Repeater является производным от класса Control. Повторитель просто повторяет данные, указанные в шаблонах. Повторяющиеся данные обычно представляют собой HTML-код, смешанный с записями из источников данных. Вывод Repeater не предопределен. Из-за этого Repeater требует больше всего работы для определения шаблона. Взамен он дает нам наибольшую гибкость для построения макета и оптимизации представления.

С тем же шаблоном и тем же набором данных Repeater обычно работает быстрее, чем элементы управления Data List или GridView. Это в основном из-за класса DataReader, который используется для доступа только для чтения. DataReader быстрее, чем классы DataSet или DataTable, обычно используемые с GridView.

По сравнению с элементами управления GridView и DataList, Repeater имеет ограниченные возможности. По умолчанию Repeater хорош для отображения данных. Это не лучший выбор, если вам нужно редактировать данные. Кроме того, по умолчанию он не обеспечивает разбиение на страницы и сортировку записей.

Элемент управления ListView — это новейший элемент управления представлением данных, представленный в
ASP.NET 3.5. Предыдущие элементы управления (Repeater, DataList и GridView) логически следуют друг за другом. Например, Repeater — самый простой, но быстрый, затем DataList имеет больше функций, но и больше накладных расходов, и, наконец, GridView — самый сложный, имеет больше функций, но самый тяжелый и, следовательно, самый медленный на странице. Теперь есть новый элемент управления ListView, который пытается предоставить лучшее с обеих сторон: скорость и гибкость в дизайне, а также множество функций, таких как разбиение на страницы, обновление или удаление записей и т. д. Из-за этого элемент управления ListView часто является лучшим выбором, чем Repeater или DataList.

Библиотека собеса по С#
👏1
Что такое виртуальный метод в C#?

Метод, который мы можем переопределить в производном классе, а это значит, что он может иметь разные реализации в базовом (исходном) и производном классах. Они используются, когда мы хотим расширить функциональность исходного метода базового класса. Мы используем ключевое слово virtual для создания виртуального метода в базовом классе, который позволяет переопределить функциональность в производном классе. То есть это пример полиморфизма. Вы не можете использовать ключевое слово virtual со статическими, абстрактными или частными методами в базовом классе.

Библиотека собеса по С#
1🥱1
Что такое Round Trip в ASP.NET?

В момент включения обработки на стороне сервера, тогда включаются четыре этапа:

1. Пользователь запрашивает веб-форму с веб-сервера.
2. Веб-сервер отвечает указанной веб-формой.
3. Пользователь вводит информацию и отправляет веб-форму на сервер.
4. Затем веб-сервер обрабатывает структуру формы и отправляет результаты обратно конкретному пользователю.

Теперь этап 3 известен как постбэк страницы, в то время как этапы 3 и 4 в совокупности известны как «Round Trip». Можно сказать, что обратный путь включает в себя выполнение полного обхода по сети к веб-браузеру и получение ответа. Веб-приложения используют HTTP для создания соответствия между веб-программой и сервером.


Библиотека собеса по С#
В проекте возникают микрофризы при спавне/деактивации множества объектов и подгрузке ассетов во время игры. Как диагностировать и убрать эти GC-спайки без ухудшения качества?

Профилировать (Unity Profiler/Deep Profile) и убрать аллокации на горячем пути: вместо Instantiate/Destroy — Object Pooling; ассеты грузить Addressables.Load*Async с предварительным прогревом; исключить LINQ/boxing/строковые конкатенации в Update; включить Incremental GC; крупные вычисления вынести в Jobs + Burst; тяжелые загрузки — на кадры/батчами; проверять, что пул и кэш не вызывают утечек (release/UnloadUnusedAssets по плану).

Библиотека собеса по С#
Различия между интерфейсом и абстрактным классом в .NET

Интерфейс определяет набор поведения, которым должны обладать классы, его реализующие. Он включает только объявления свойств, методов и событий, без указания модификаторов доступа. Все члены интерфейса обязательно должны быть реализованы в классах, которые его используют.

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


Библиотека собеса по С#
🥱6😁1
Как спроектировать архитектуру мобильной игры в Unity, чтобы удерживать стабильные 60 FPS при тысячах активных сущностей и уметь выкатывать контент без обновления клиента (через CDN), при этом минимизируя аллокации и времена загрузок?

Симуляцию вынести в ECS/DOTS с Jobs+Burst и фиксированным тиками, рендер отделить через Hybrid Renderer; для остального — агрегировать поведение в небольшое число систем вместо тысяч Update(). Память держать под контролем: NativeArray/пулы, адресная загрузка через Addressables с remote catalog, хэшами и версионированием на CDN, всё асинхронно с бюджетами времени кадра и пределами concurrent загрузки. Мир стримить аддитивно через Subscenes и пред-бейк, ассеты ужимать (ASTC/ETC2, LOD/mesh compression), шейдер-варианты резать. На сборке — IL2CPP, managed/code stripping, отключённые подробные исключения. Профилировать и регрессии ловить в CI (Profiler, Memory Profiler, Frame Debugger), целититься в бюджеты: CPU ≤ 6–8 мс, render ≤ 6–8 мс, загрузка — мелкими батчами без спайков GC.

🐸Библиотека собеса по С#
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3😁1
Что такое readonly struct в C# и в чём его отличие от обычной структуры? В каких случаях стоит использовать readonly struct?

readonly struct в C# — это структура, у которой запрещено изменение состояния после создания. Все поля такой структуры должны быть помечены как readonly, и любые методы не имеют права изменять содержимое полей. Это создаёт гарантию, что экземпляр структуры остаётся неизменным. Главное отличие от обычной структуры заключается в том, что обычная структура может быть изменена после создания, а readonly struct — нет. Использовать readonly struct имеет смысл в ситуациях, когда структура представляет собой логически неизменяемый объект (например, координата, цвет, диапазон), и нужно обеспечить как защиту от случайных изменений, так и избежать лишнего копирования при передаче в методы или возвращении из них.

Библиотека собеса по С#
👍6
Является ли тип List потокобезопасной коллекцией?

Тип List может быть безопасным для потоков в случае операций чтения. Однако пользовательский код должен самостоятельно обеспечивать синхронизацию при параллельном добавлении или удалении элементов из коллекции в нескольких потоках.

Библиотека собеса по С#
😁41
За год мы провели три потока курса по ИИ-агентам, а теперь запускаем масштабное обновление!

В новом, четвёртом потоке мы учли все пожелания студентов, добавили большой блок про AgentOps и сместили фокус с базовых концепций на суровый инжиниринг. Ответить на вопросы про сборку мусора и асинхронность в C на собеседовании легко, а вот интегрировать ИИ-агента в корпоративный контур, чтобы он не галлюцинировал в проде — задача со звёздочкой.

В программе:

— практика с первого занятия: Jupyter-ноутбуки с автопроверкой;
— оркестрация в LangGraph: human-in-the-loop и механизм time-travel;
— продвинутый RAG для продакшена и парсинг сложных документов;
— контроль экономики агентов: маршрутизация и кеширование запросов;
— развёртывание локальных опенсорс-моделей с соблюдением 152-ФЗ.

В честь старта продаж действует спецпредложение: 3 курса по цене 1 (два дополнительных курса в подарок).

Доступ к материалам для предварительной подготовки откроется сразу после оплаты.

По промокоду Agent забирайте скидку 10 000 ₽ (89 000 ₽ вместо 99 000 ₽). Успейте занять место до 28 февраля!

👉 Присоединиться к четвёртому потоку и вывести агентов в прод
Что такое .Net Framework?

.NET Framework — программная платформа, выпущенная компанией Microsoft в 2002 году. Основой платформы является общеязыковая среда исполнения Common Language Runtime (CLR), которая подходит для разных языков программирования. Функциональные возможности CLR доступны в любых языках программирования, использующих эту среду.

Библиотека собеса по С#
🙏1
Сколько типов серверных элементов управления поддерживает ASP.NET?

В ASP.NET в основном существует четыре различных типа элементов управления на стороне сервера:

✍️ Элементы управления сервером HTML;
✍️ Элементы управления веб-сервером;
✍️ Элементы управления пользователем;
✍️ Элементы управления проверкой.


Библиотека собеса по С#
🌚4😁2😢1