Библиотека собеса по C# | вопросы с собеседований
Ir al canal en Telegram
Вопросы с собеседований по C# и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://clc.to/QRJIVw Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197
Mostrar más5 642
Suscriptores
+324 horas
+57 días
+1230 días
Archivo de publicaciones
В проекте возникают микрофризы при спавне/деактивации множества объектов и подгрузке ассетов во время игры. Как диагностировать и убрать эти GC-спайки без ухудшения качества?
Профилировать (Unity Profiler/Deep Profile) и убрать аллокации на горячем пути: вместо Instantiate/Destroy — Object Pooling; ассеты грузить Addressables.Load*Async с предварительным прогревом; исключить LINQ/boxing/строковые конкатенации в Update; включить Incremental GC; крупные вычисления вынести в Jobs + Burst; тяжелые загрузки — на кадры/батчами; проверять, что пул и кэш не вызывают утечек (release/UnloadUnusedAssets по плану).
Библиотека собеса по С#
📣 Если C# для вас — это уже не просто язык, а инструмент для построения систем, следующий шаг — научиться проектировать и разрабатывать так, как это делают сильные команды в продакшене.
Курс «C# Developer. Professional» — про Best Practices .NET-разработки и реальную инженерную работу. Вы углубитесь в работу с атрибутами, асинхронность и многопоточность, разберёте паттерны проектирования, работу с SQL и NoSQL, кэширование, CI/CD и тестирование.
❕Программа построена вокруг практики и командной разработки. Вы будете работать в Scrum-команде, проходя весь цикл: от постановки задач до итогового проекта. Преподаватели — практикующие эксперты, программа регулярно обновляется под требования рынка. Это обучение, которое повышает инженерную зрелость и ценность специалиста.
➡️Старт курса - 27 февраля. Курс доступен в рассрочку. Пройдите короткое вступительное тестирование и получите специальные условия на обучение: https://clc.to/A9MlwQ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Что такое Round Trip в ASP.NET?
В момент включения обработки на стороне сервера, тогда включаются четыре этапа:
1. Пользователь запрашивает веб-форму с веб-сервера.
2. Веб-сервер отвечает указанной веб-формой.
3. Пользователь вводит информацию и отправляет веб-форму на сервер.
4. Затем веб-сервер обрабатывает структуру формы и отправляет результаты обратно конкретному пользователю.
Теперь этап 3 известен как постбэк страницы, в то время как этапы 3 и 4 в совокупности известны как «Round Trip». Можно сказать, что обратный путь включает в себя выполнение полного обхода по сети к веб-браузеру и получение ответа. Веб-приложения используют HTTP для создания соответствия между веб-программой и сервером.
Библиотека собеса по С#
Что такое виртуальный метод в C#?
Метод, который мы можем переопределить в производном классе, а это значит, что он может иметь разные реализации в базовом (исходном) и производном классах. Они используются, когда мы хотим расширить функциональность исходного метода базового класса. Мы используем ключевое слово virtual для создания виртуального метода в базовом классе, который позволяет переопределить функциональность в производном классе. То есть это пример полиморфизма. Вы не можете использовать ключевое слово virtual со статическими, абстрактными или частными методами в базовом классе.
Библиотека собеса по С#
Как бы вы объяснили разницу между 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.
Библиотека собеса по С#
В вашей команде разработчиков часто случаются конфликты при merge в main. Как вы будете диагностировать и выстраивать процесс так, чтобы минимизировать количество конфликтов?
Анализировать, где чаще всего возникают конфликты (монолитные файлы, частые изменения), внедрить короткоживущие feature-ветки и регулярные rebase на main, настроить code ownership и pull request review. При необходимости — разбить большие модули на более мелкие, а также автоматизировать форматирование кода, чтобы уменьшить “шум” в diff.
Библиотека собеса по С#
В чем разница между переменными объектного типа и переменными динамического типа в C#?
Динамические и объектные переменные имеют схожую функцию. Переменные объектного типа проверяют тип во время компиляции, тогда как динамические переменные — во время выполнения.
🐸Библиотека собеса по С#
Когда выбирать ValueTask вместо Task и какие у него подводные камни?
Используй ValueTask только в «горячих» путях, где операция очень часто завершается синхронно и ты реально избегаешь аллокации Task; во всех прочих случаях — Task проще и безопаснее. Ограничения: ValueTask — struct, легко копируется и раздувает захваты в замыканиях; его можно корректно ожидать лишь один раз (если источник — IValueTaskSource), для повторных ожиданий/комбинаторов сначала делай AsTask(); неверное повторное ожидание ведёт к гонкам/исключениям; AP
Библиотека собеса по С#
Когда использовать StringBuilder предпочтительнее, чем string?
StringBuilder предпочтительнее использовать, если строка часто изменяется.
🐸Библиотека собеса по С#
Как используются делегаты в C#?
Делегаты имеют несколько применений. Некоторые из них — механизм обратного вызова, многоадресная рассылка, асинхронная обработка, а также методы абстрагирования и инкапсуляции.
Библиотека собеса по С#
Когда использовать StringBuilder предпочтительнее, чем string?
StringBuilder предпочтительнее использовать, если строка часто изменяется.
🐸Библиотека собеса по С#
Зачем Span<T> сделан ref struct, где его нельзя использовать, и когда вместо него брать Memory<T>?
Span<T> — ref struct, чтобы не «утекать» на кучу: его нельзя хранить в полях классов, боксить, захватывать в лямбды/итераторы/async-стейтмашины; он должен жить только в текущем синхронном фрейме (часто ссылается на стек/неуправляемую память). Для долгоживущих/асинхронных сценариев берут Memory<T>/ReadOnlyMemory<T> (они heap-safe) и при необходимости получают краткоживущий Span через .Span.
🐸Библиотека собеса по С#
🟥 Утечки данных в .NET-приложениях чаще происходят не из-за хакеров, а из-за неверной работы с ключами, конфигурациями и базовой криптографией. Ошибки на уровне кода быстро превращаются в инциденты.
На открытом уроке разберём практическое применение System.Security.Cryptography: AES, RSA, хеширование и цифровые подписи. Поговорим о безопасном хранении и передаче секретов, управлении ключами и принципе наименьших привилегий.
❗️ Вы системно разберёте уязвимости OWASP Top-10 для .NET: инъекции, небезопасную десериализацию, XSS, CSRF — и способы их нейтрализации на уровне кода и архитектуры. Отдельно обсудим шифрование данных в БД, защиту строк подключения и безопасное логирование без утечек токенов.
🟥Встречаемся 10 февраля в 20:00 МСК в преддверии старта курса «C# Developer. Professional».
Зарегистрируйтесь, чтобы не пропустить: https://clc.to/8jCEXw
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Объясните, что реально происходит при 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.
Библиотека собеса по С#
Что делает lock(obj) под капотом и почему плохая идея — блокировать this или строку?
Компилятор разворачивает в try { Monitor.Enter(obj); } finally { Monitor.Exit(obj); }, монитор реентерабелен и висит на объекте. Блокировка this/публичных объектов/строк опасна: внешний код может их тоже залочить (строки интернируются) → риск дедлоков и лишнего контеншна.
Библиотека собеса по С#
Можно ли вызывать 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, не аллоцируем каждый кадр.
Библиотека собеса по С#
🦾 Что такое абстракция и как она связана с ООП?
Под абстракцией понимается модель реальной жизни, упрощенная для решения конкретной задачи, которая выражена в объекте, то есть любой объект — это абстракция, так как она только частично описывает реальную сущность. Поэтому любой объект можно считать абстракцией и он только частично описывает реальную сущность. Во время преобразования реальных сущностей в объект, он лишается тех характеристик, которые являются несущественными деталями.
Например можно составить упрощенный класс человека, который умеет двигаться, а от всего остального мы абстрагируемся (в данным случае несущественно то, что он умеет дышать, кушать, видеть, слышать и так далее).
Библиотека собеса по С#
Каково назначение функции Awake в скриптах Unity?
Функция Awake — это специальный метод в Unity, который вызывается при загрузке экземпляра скрипта. Он используется для инициализации переменных или состояния игры перед ее запуском. Awake вызывается только один раз за время существования экземпляра скрипта и вызывается даже если компонент отключен.
Awake используется для инициализаций, которые должны быть выполнены до вызова методов Start любых других скриптов, обеспечивая правильную настройку ссылок на объекты и начального состояния.
🐸Библиотека собеса по С#
В Unity объясните различия между FixedUpdate, Update и LateUpdate. Как вы решите, когда использовать каждый из этих методов обновления для различных компонентов игрового движка, таких как обработка физики, общая логика игры, и анимации?
Краткий ответ: В Unity, методы FixedUpdate, Update и LateUpdate используются для различных целей в игровом цикле:
FixedUpdate вызывается с фиксированным интервалом времени и является идеальным для обработки всего, что связано с физикой, так как физический движок Unity обновляется в фиксированные моменты времени. Это обеспечивает стабильность физических вычислений независимо от частоты кадров.
Update вызывается один раз за кадр и используется для общей игровой логики, такой как получение ввода от пользователя, перемещение персонажей, обновление таймеров и т.д. Так как частота вызовов Update зависит от частоты кадров, это не подходит для обработки физики.
LateUpdate вызывается после всех Update вызовов в кадре. Этот метод часто используется для действий, которые должны происходить после всех основных обновлений игры, например, для камеры, следящей за персонажем, чтобы убедиться, что персонаж уже переместился, прежде чем обновлять положение камеры.
🐸Библиотека собеса по С#
Объясните, что такое локальная переменная в C#.
Локальными переменными называются переменные, которые определены в блоке кода. Они видны только в блоке кода, в котором они объявлены.
🐸Библиотека собеса по С#
