Библиотека собеса по C# | вопросы с собеседований
5.68K subscribers
214 photos
2 videos
1 file
202 links
Вопросы с собеседований по C# и ответы на них.

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

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

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
Как вы бы подошли к оптимизации сцены в Unity для виртуальной реальности (VR), учитывая ограничения по производительности? Обсудите как вы бы управляли ресурсами, освещением и рендерингом.

Этот вопрос тестирует понимание кандидатом специфических аспектов оптимизации в Unity для VR. Оптимизация для VR имеет особое значение из-за высоких требований к производительности и низкой задержке. Ответ должен включать стратегии по оптимизации ассетов и текстур, управлению памятью, использованию LOD (Level of Detail) систем для управления сложностью моделей, а также эффективному использованию освещения и теней. Кандидат также может обсудить использование различных профилировщиков и инструментов для мониторинга производительности, а также специфические подходы к рендерингу для VR, такие как сокращение overdraw и использование occlusion culling.
Чем отличаются интерфейсы от абстрактных классов в C#?

Интерфейсы и абстрактные классы в C# являются механизмами для реализации полиморфизма и обеспечения повторного использования кода. Вот основные отличия между ними:

1. Отношение к классам-наследникам: Абстрактный класс может иметь как абстрактные, так и конкретные (реализованные) методы. Интерфейс же предоставляет только определения методов. Класс может наследоваться только от одного абстрактного класса, но может реализовывать несколько интерфейсов.

2. Реализация: Абстрактным классам разрешено иметь переменные экземпляра и иметь реализацию методов. Интерфейсы могут иметь только методы (и свойства) без реализации, только сигнатуры. Класс, реализующий интерфейс, должен предоставить реализацию всех методов и свойств интерфейса.

3. Использование: Абстрактные классы применяются, когда некоторые базовые методы и свойства должны быть доступны и переопределены в классах-наследниках. Интерфейсы используются для создания контракта, который должны выполнить классы, обеспечивая использование полиморфизма.

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

Если у вас уже есть набор данных (массив или List), скорее всего вам нужно перемешивание его «на месте». Для этого подойдёт алгоритм из 3.4.2P из TAOCP, известный также как Fisher–Yates shuffle.

Пусть ваши данные находятся в массиве T[] data. Пусть random — экземпляр типа Random*. Тогда для перемешивания подходит следующий код.

Подробнее ознакомиться можно здесь.
Как сложить строку с числом?

Ответ на картинке.
Оператор Continue

А что если мы хотим, чтобы при проверке цикл не завершался, а просто пропускал текущую итерацию. Для этого мы можем воспользоваться оператором continue.

В этом случае цикл, когда дойдет до числа 2, которое не удовлетворяет условию проверки, просто пропустит это число и перейдет к следующей итерации.
Объясните, как работают асинхронные делегаты в C#, и как они могут быть использованы для улучшения производительности приложений?

Асинхронные делегаты в C# позволяют выполнить метод асинхронно в отдельном потоке. Это делается с помощью методов BeginInvoke и EndInvoke. BeginInvoke запускает метод асинхронно, а EndInvoke ожидает завершения метода и возвращает результат. Асинхронные делегаты полезны для выполнения длительных операций, таких как I/O операции или сложные вычисления, без блокирования основного потока выполнения. Это улучшает отзывчивость приложения, особенно в GUI-приложениях, где важно поддерживать активный пользовательский интерфейс, в то время как выполняются фоновые задачи. Однако, следует управлять ресурсами и обрабатывать исключения при использовании асинхронных делегатов, чтобы избежать утечек памяти и других проблем.
В чем разница между Update и FixedUpdate в Unity, и какие сценарии лучше всего подходят для каждого из них?

В Unity, Update вызывается один раз за кадр и идеально подходит для большинства обновлений игровой логики, таких как получение ввода пользователя и перемещение персонажей. FixedUpdate, с другой стороны, вызывается с фиксированным интервалом времени и лучше всего подходит для обновлений, связанных с физикой, таких как применение сил, поскольку это обеспечивает более стабильное и предсказуемое поведение физической системы.
Доступ к элементам 2D-массива

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

При помощи метода Remove() удаляется группа символов в строковых данных. В параметрах метода указывается номер символа, после которого все последующие элементы должны быть удалены.
Изменение размера массива

Для изменения размера массива применяется метод Resize. Его первый параметр - изменяемый массив, а второй параметр - количество элементов, которые должны быть в массиве.

Если второй параметр меньше длины массива, то массив усекается. Если значение параметра, наоборот, больше, то массив дополняется дополнительными элементами, которые имеют значение по умолчанию. Причем первый параметр передается по ссылке.
Строковая интерполяция

Строковая интерполяция в C# позволяет встраивать выражения непосредственно в строковые литералы, что упрощает форматирование и делает код более читаемым.

Строковая интерполяция в C# значительно упрощает работу со строками, особенно когда нужно включить в них значения переменных или результаты выражений.
Какой синтаксис нужно использовать в C# для отлова любого возможного исключения?

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

Ответ на картинке.
Метод ToString

Метод ToString() не только получает строковое описание объекта, но и может осуществлять форматирование. Он поддерживает те же описатели, что используются в методе Format.
Простой способ сравнить массивы в C#

Воспользуйтесь методом Enumerable.SequenceEqual.
Можете ли вы объяснить различие между управляемой кучей в .NET и стеком, и как это влияет на управление памятью и производительность приложения?

В .NET управляемая куча — это область памяти, используемая для размещения объектов, управляемых средой CLR (Common Language Runtime), которые уничтожаются автоматически с помощью сборщика мусора. Это помогает предотвратить утечки памяти и обеспечивает автоматизацию управления памятью. Стек используется для хранения примитивов и ссылок на объекты в куче, которые создаются в рамках потока исполнения и имеют время жизни, ограниченное текущим контекстом вызова (например, выполнением метода).

Управление памятью в стеке более быстрое, поскольку объекты выделяются и освобождаются в порядке LIFO (Last In, First Out), что требует минимального управления. В куче же объекты могут быть размещены и освобождены в произвольном порядке, что требует более сложного управления и периодического запуска сборщика мусора, что может влиять на производительность. Однако куча позволяет работать с динамически создаваемыми объектами, что необходимо для большинства приложений.
Объясните, что такое Prefabs в Unity 3D?

Prefab в Unity 3D называется готовым шаблоном объекта (класс, объединяющий объекты и скрипты). Во время разработки префаб можно перетащить из окна проекта в окно сцены и добавить в сцену иерархию игровых объектов.

При желании объект потом можно редактировать. Во время выполнения сценарий может вызвать создание нового экземпляра объекта в заданном месте или с заданным набором свойств преобразования.
Объясните, как Unity обрабатывает и управляет сценами и активами, в частности, расскажите о процессе загрузки и выгрузки сцен, а также о том, как управлять памятью и ресурсами при работе с большим количеством активов и сложными сценами.

Unity управляет сценами и активами с использованием своего внутреннего механизма управления ресурсами. Загрузка сцен осуществляется через класс SceneManager, который позволяет загружать, выгружать и переключаться между сценами. Для оптимизации памяти и производительности используются техники, такие как асинхронная загрузка сцен (SceneManager.LoadSceneAsync), что позволяет избежать подвисаний игры во время загрузки. Управление активами включает в себя правильное использование ассетбандлов для загрузки и выгрузки ресурсов по требованию, что снижает нагрузку на память. Важно также использовать профайлер для отслеживания использования ресурсов и оптимизации загрузки активов, особенно в больших и сложных сценах, чтобы обеспечить стабильную и эффективную работу приложения.
Что такое пространство имен и является ли оно обязательным?

Ответ:
Пространство имен - это способ организации классов одной и той же группы или функциональности под одним и тем же именем. Мы можем назвать это модулем. Хотя не обязательно помещать класс в пространство имен.