Чем отличаются друг от друга классы String и StringBuilder?
Объект класса
Когда выполняется какой-нибудь метод класса String, система создает новый объект в памяти с выделением ему достаточного места.
Объект класса
При создании строки
В том случае если выделенной памяти не будет хватать для добавления новых элементов, то емкость объекта будет увеличена.
Объект класса
String
представляет собой неизменяемую строку.Когда выполняется какой-нибудь метод класса String, система создает новый объект в памяти с выделением ему достаточного места.
Объект класса
StringBuilder
представляет собой динамическую строку.При создании строки
StringBuilder
выделяет памяти больше, чем необходимо этой строке, а при добавлении к ней каких-либо элементов строка не пересоздается заново.В том случае если выделенной памяти не будет хватать для добавления новых элементов, то емкость объекта будет увеличена.
Что такое Boxing и Unboxing?
Упаковка представляет собой процесс неявный преобразования типа значения (хранящегося в стеке) в тип object. Когда тип значения упаковывается средой CLR, она создает оболочку значения внутри
Обратная операция распаковки осуществляется явным преобразованием
Упаковка представляет собой процесс неявный преобразования типа значения (хранящегося в стеке) в тип object. Когда тип значения упаковывается средой CLR, она создает оболочку значения внутри
System.Object
и сохраняет ее в управляемой куче. Обратная операция распаковки осуществляется явным преобразованием
object
в тип значения. Если упакованный объект не соответствует требуемому типу, то выбрасывается исключение InvalidCastException
.Что выведет на консоль следующая программа и почему?
Ответ:
Программа не скомпилируется, поскольку переменная name, к которой мы хотим обратиться в методе Main, не имеет модификаторов. Следовательно, по умолчанию она имеет модификатор доступа private. Поэтому вне класса Person к этой переменной мы обратиться не можем.
Ответ:
В чем различие между операцией cast (приведения типов) и оператором as?
Ответ:
В случае ошибки cast выбрасывает исключение InvalidCastException, а оператор as возвращает null.
Ответ:
Какова алгоритмическая сложность для операций чтения и записи для коллекции Dictionary?
Чтение очень быстрое, потому что используются хэш-таблицы и сложность в этом случае стремится к O(1).
Запись проходит тоже очень быстро (O(1)), в том случае если .Count меньше емкости, если же больше, то скорость стремится к O(n).
Чтение очень быстрое, потому что используются хэш-таблицы и сложность в этом случае стремится к O(1).
Запись проходит тоже очень быстро (O(1)), в том случае если .Count меньше емкости, если же больше, то скорость стремится к O(n).
Может ли DateTime равняться null? Почему?
Нет, т.к. DateTime это тип значение, наследован из System.ValueType.
Что подразумевается под свойствами в C#?
В C# существуют специальные методы доступа, которые и именуются свойствами. Они обеспечивают простой доступ к полям класса для получения или установки их значения. Определение свойства содержит блоки get и set. В блоке get возвращается значение поля, а в блоке set устанавливается с помощью параметра value, которое представляет передаваемое значение.
Как в C# реализуется паттерн "Lazy Initialization" и какие меры предосторожности необходимо предпринять для его корректного использования в многопоточных приложениях?
В C# "Lazy Initialization" реализуется с помощью класса Lazy<T>, который обеспечивает отложенную инициализацию объекта. Для обеспечения безопасности в многопоточных приложениях, важно использовать конструктор Lazy<T> с параметром LazyThreadSafetyMode, который контролирует доступ к объекту и обеспечивает потокобезопасную инициализацию. Это предотвращает создание нескольких экземпляров в многопоточной среде и гарантирует, что объект будет инициализирован только один раз.
Объясните, что такое фиксированный временной шаг в Unity3D? Почему настройка фиксированного времени влияет на скорость игры?
Функция Fixed Timestep помогает установить обновления системы через фиксированный интервал времени. Механизм, подобный очереди, будет управлять всеми событиями в реальном времени, которые накапливаются между временными эпохами.
Если частота кадров упадет ниже некоторого порогового значения, установленного для фиксированного временного шага, это может повлиять на скорость игры.
Если частота кадров упадет ниже некоторого порогового значения, установленного для фиксированного временного шага, это может повлиять на скорость игры.
Как вы бы подошли к оптимизации сцены в Unity для виртуальной реальности (VR), учитывая ограничения по производительности? Обсудите как вы бы управляли ресурсами, освещением и рендерингом.
Этот вопрос тестирует понимание кандидатом специфических аспектов оптимизации в Unity для VR. Оптимизация для VR имеет особое значение из-за высоких требований к производительности и низкой задержке. Ответ должен включать стратегии по оптимизации ассетов и текстур, управлению памятью, использованию LOD (Level of Detail) систем для управления сложностью моделей, а также эффективному использованию освещения и теней. Кандидат также может обсудить использование различных профилировщиков и инструментов для мониторинга производительности, а также специфические подходы к рендерингу для VR, такие как сокращение overdraw и использование occlusion culling.
Чем отличаются интерфейсы от абстрактных классов в C#?
Интерфейсы и абстрактные классы в C# являются механизмами для реализации полиморфизма и обеспечения повторного использования кода. Вот основные отличия между ними:
1. Отношение к классам-наследникам: Абстрактный класс может иметь как абстрактные, так и конкретные (реализованные) методы. Интерфейс же предоставляет только определения методов. Класс может наследоваться только от одного абстрактного класса, но может реализовывать несколько интерфейсов.
2. Реализация: Абстрактным классам разрешено иметь переменные экземпляра и иметь реализацию методов. Интерфейсы могут иметь только методы (и свойства) без реализации, только сигнатуры. Класс, реализующий интерфейс, должен предоставить реализацию всех методов и свойств интерфейса.
3. Использование: Абстрактные классы применяются, когда некоторые базовые методы и свойства должны быть доступны и переопределены в классах-наследниках. Интерфейсы используются для создания контракта, который должны выполнить классы, обеспечивая использование полиморфизма.
Оба механизма полезны в разных сценариях разработки. Выбор между использованием абстрактных классов и интерфейсов зависит от конкретных требований проекта.
1. Отношение к классам-наследникам: Абстрактный класс может иметь как абстрактные, так и конкретные (реализованные) методы. Интерфейс же предоставляет только определения методов. Класс может наследоваться только от одного абстрактного класса, но может реализовывать несколько интерфейсов.
2. Реализация: Абстрактным классам разрешено иметь переменные экземпляра и иметь реализацию методов. Интерфейсы могут иметь только методы (и свойства) без реализации, только сигнатуры. Класс, реализующий интерфейс, должен предоставить реализацию всех методов и свойств интерфейса.
3. Использование: Абстрактные классы применяются, когда некоторые базовые методы и свойства должны быть доступны и переопределены в классах-наследниках. Интерфейсы используются для создания контракта, который должны выполнить классы, обеспечивая использование полиморфизма.
Оба механизма полезны в разных сценариях разработки. Выбор между использованием абстрактных классов и интерфейсов зависит от конкретных требований проекта.
Как перемешать (случайно переставить) элементы в массиве?
Если у вас уже есть набор данных (массив или List), скорее всего вам нужно перемешивание его «на месте». Для этого подойдёт алгоритм из 3.4.2P из TAOCP, известный также как Fisher–Yates shuffle.
Пусть ваши данные находятся в массиве T[] data. Пусть random — экземпляр типа Random*. Тогда для перемешивания подходит следующий код.
Подробнее ознакомиться можно здесь.
Если у вас уже есть набор данных (массив или List), скорее всего вам нужно перемешивание его «на месте». Для этого подойдёт алгоритм из 3.4.2P из TAOCP, известный также как Fisher–Yates shuffle.
Пусть ваши данные находятся в массиве T[] data. Пусть random — экземпляр типа Random*. Тогда для перемешивания подходит следующий код.
Подробнее ознакомиться можно здесь.
Оператор Continue
А что если мы хотим, чтобы при проверке цикл не завершался, а просто пропускал текущую итерацию. Для этого мы можем воспользоваться оператором continue.
В этом случае цикл, когда дойдет до числа 2, которое не удовлетворяет условию проверки, просто пропустит это число и перейдет к следующей итерации.
А что если мы хотим, чтобы при проверке цикл не завершался, а просто пропускал текущую итерацию. Для этого мы можем воспользоваться оператором continue.
В этом случае цикл, когда дойдет до числа 2, которое не удовлетворяет условию проверки, просто пропустит это число и перейдет к следующей итерации.
Объясните, как работают асинхронные делегаты в C#, и как они могут быть использованы для улучшения производительности приложений?
Асинхронные делегаты в C# позволяют выполнить метод асинхронно в отдельном потоке. Это делается с помощью методов BeginInvoke и EndInvoke. BeginInvoke запускает метод асинхронно, а EndInvoke ожидает завершения метода и возвращает результат. Асинхронные делегаты полезны для выполнения длительных операций, таких как I/O операции или сложные вычисления, без блокирования основного потока выполнения. Это улучшает отзывчивость приложения, особенно в GUI-приложениях, где важно поддерживать активный пользовательский интерфейс, в то время как выполняются фоновые задачи. Однако, следует управлять ресурсами и обрабатывать исключения при использовании асинхронных делегатов, чтобы избежать утечек памяти и других проблем.
В чем разница между Update и FixedUpdate в Unity, и какие сценарии лучше всего подходят для каждого из них?
В Unity, Update вызывается один раз за кадр и идеально подходит для большинства обновлений игровой логики, таких как получение ввода пользователя и перемещение персонажей. FixedUpdate, с другой стороны, вызывается с фиксированным интервалом времени и лучше всего подходит для обновлений, связанных с физикой, таких как применение сил, поскольку это обеспечивает более стабильное и предсказуемое поведение физической системы.