Можете ли вы кратко объяснить, что такое пул потоков в C#?
Thread Pool в C# — это, по сути, коллекция потоков. Эти потоки используются для выполнения задач, не внося помех в реализацию основного потока. После того, как поток из пула потоков завершает реализацию, он возвращается в пул потоков.
Библиотека собеса по С#
Библиотека собеса по С#
😁3
В паттерне MVVM командная логика реализуется через интерфейс ICommand, который связывает действия пользователя (например, нажатие кнопки) с выполнением бизнес-логики в ViewModel.
ICommand имеет два метода:
• Execute — выполняет команду.
• CanExecute — проверяет, можно ли выполнить команду, например, активировать или деактивировать кнопку.
Когда пользователь выполняет действие, вызывается Execute, а CanExecute управляет доступностью команды. Это разделение логики между View и ViewModel улучшает тестируемость и поддерживаемость кода, поскольку UI не содержит бизнес-логики.
Please open Telegram to view this post
VIEW IN TELEGRAM
В ASP.NET Core у вас кэш над БД. Когда TTL истекает, сотни запросов одновременно пробивают кэш и штурмуют БД (cache stampede). Как спроектировать дедупликацию «получения значения» per-key без дедлоков и утечек, учитывая отмену/таймауты?
Сделать single-flight per key: ConcurrentDictionary<TKey, Lazy<Task<T>>> (или AsyncLazy) + GetOrAdd. Первый запрос запускает загрузку, остальные await той же Task. Важно: на ошибке/отмене удалять ключ из словаря, чтобы не закрепить failed-task; прокидывать CancellationToken; ставить таймаут и stale-while-revalidate для мягкого обновления. Для изоляции горячих ключей — пер-key SemaphoreSlim или Channel; результаты хранить в IMemoryCache с policy (TTL, size, eviction).
Библиотека собеса по С#
Библиотека собеса по С#
👍9
Что такое ViewState?
ViewState — это функция ASP.NET для сохранения значений страницы перед ее отправкой на сервер. После публикации страницы данные из ViewState восстанавливаются.
🐸 Библиотека собеса по С#
Please open Telegram to view this post
VIEW IN TELEGRAM
Можно ли разрешить наследование класса, но запретить переопределение его метода?
Да, это возможно для второго класса в иерархии наследования. Для этого нужно использовать модификатор sealed в сочетании с ключевым словом override при переопределении виртуального метода. Таким образом, дальнейшее переопределение этого метода в последующих классах будет запрещено.
🐸 Библиотека собеса по С#
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Объясните, что такое локальная переменная в C#.
Локальными переменными называются переменные, которые определены в блоке кода. Они видны только в блоке кода, в котором они объявлены.
🐸 Библиотека собеса по С#
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3
В Unity объясните различия между FixedUpdate, Update и LateUpdate. Как вы решите, когда использовать каждый из этих методов обновления для различных компонентов игрового движка, таких как обработка физики, общая логика игры, и анимации?
Краткий ответ: В Unity, методы FixedUpdate, Update и LateUpdate используются для различных целей в игровом цикле:
FixedUpdate вызывается с фиксированным интервалом времени и является идеальным для обработки всего, что связано с физикой, так как физический движок Unity обновляется в фиксированные моменты времени. Это обеспечивает стабильность физических вычислений независимо от частоты кадров.
Update вызывается один раз за кадр и используется для общей игровой логики, такой как получение ввода от пользователя, перемещение персонажей, обновление таймеров и т.д. Так как частота вызовов Update зависит от частоты кадров, это не подходит для обработки физики.
LateUpdate вызывается после всех Update вызовов в кадре. Этот метод часто используется для действий, которые должны происходить после всех основных обновлений игры, например, для камеры, следящей за персонажем, чтобы убедиться, что персонаж уже переместился, прежде чем обновлять положение камеры.
🐸 Библиотека собеса по С#
FixedUpdate вызывается с фиксированным интервалом времени и является идеальным для обработки всего, что связано с физикой, так как физический движок Unity обновляется в фиксированные моменты времени. Это обеспечивает стабильность физических вычислений независимо от частоты кадров.
Update вызывается один раз за кадр и используется для общей игровой логики, такой как получение ввода от пользователя, перемещение персонажей, обновление таймеров и т.д. Так как частота вызовов Update зависит от частоты кадров, это не подходит для обработки физики.
LateUpdate вызывается после всех Update вызовов в кадре. Этот метод часто используется для действий, которые должны происходить после всех основных обновлений игры, например, для камеры, следящей за персонажем, чтобы убедиться, что персонаж уже переместился, прежде чем обновлять положение камеры.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Каково назначение функции Awake в скриптах Unity?
Функция Awake — это специальный метод в Unity, который вызывается при загрузке экземпляра скрипта. Он используется для инициализации переменных или состояния игры перед ее запуском. Awake вызывается только один раз за время существования экземпляра скрипта и вызывается даже если компонент отключен.
Awake используется для инициализаций, которые должны быть выполнены до вызова методов Start любых других скриптов, обеспечивая правильную настройку ссылок на объекты и начального состояния.
🐸 Библиотека собеса по С#
Awake используется для инициализаций, которые должны быть выполнены до вызова методов Start любых других скриптов, обеспечивая правильную настройку ссылок на объекты и начального состояния.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🦾 Что такое абстракция и как она связана с ООП?
Под абстракцией понимается модель реальной жизни, упрощенная для решения конкретной задачи, которая выражена в объекте, то есть любой объект — это абстракция, так как она только частично описывает реальную сущность. Поэтому любой объект можно считать абстракцией и он только частично описывает реальную сущность. Во время преобразования реальных сущностей в объект, он лишается тех характеристик, которые являются несущественными деталями.
Например можно составить упрощенный класс человека, который умеет двигаться, а от всего остального мы абстрагируемся (в данным случае несущественно то, что он умеет дышать, кушать, видеть, слышать и так далее).
Библиотека собеса по С#
Например можно составить упрощенный класс человека, который умеет двигаться, а от всего остального мы абстрагируемся (в данным случае несущественно то, что он умеет дышать, кушать, видеть, слышать и так далее).
Библиотека собеса по С#
❤4🥱2
Можно ли вызывать 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
😁4❤2
Как используются делегаты в 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.
Библиотека собеса по С#
С тем же шаблоном и тем же набором данных Repeater обычно работает быстрее, чем элементы управления Data List или GridView. Это в основном из-за класса DataReader, который используется для доступа только для чтения. DataReader быстрее, чем классы DataSet или DataTable, обычно используемые с GridView.
По сравнению с элементами управления GridView и DataList, Repeater имеет ограниченные возможности. По умолчанию Repeater хорош для отображения данных. Это не лучший выбор, если вам нужно редактировать данные. Кроме того, по умолчанию он не обеспечивает разбиение на страницы и сортировку записей.
Элемент управления ListView — это новейший элемент управления представлением данных, представленный в
Библиотека собеса по С#
👏1