Вопросы на собеседовании
PHP
C++ (ООП)
Базы данных
.NET
Некоторые распространенные вопросы на собеседовании для .NET программиста:
Что такое managed code?
Что такое assembly?
Что такое приватные и совместные сборки?
Что такое assembly manifest?
В чем разница между понятиями namespace и assembly?
В чем различие между Value Type и Reference Type?
Когда объект удаляется сборщиком мусора?
Что такое Code Access Security (CAS)?
Что такое attribute?
Как обеспечить использование именованных параметров в конструкторе атрибута?
В чем различие между Finalize и Dispose?
Что такое Reflection?
Что такое Boxing и Unboxing?
Что такое GAC?
Оставить комментарий
Что такое CLR? Что такое IL? Что такое CLS?
IL (Intermediate Language) - код, содержащий набор инструкций, не зависящих от платформы. Иными словами, после компиляции исходного кода он преобразуется не в код для какой-то определенной платформы, а в промежуточный код на языке IL.
CLS ("Common Language Specification", общеязыковая спецификация) - это набор правил, следуя которым разработчики достигают бесконфликтной работы во всех языках .NET.
Что такое managed code?
Что такое assembly?
Что такое приватные и совместные сборки?
При приватных сборках приложение изолируется от внешнего воздействия программ и операционной системы, отпадает необходимость заботиться об уникальности имен в глобальном пространстве имен.
Чтобы сделать сборку совместной, ее необходимо специальным образом собрать и присвоить ей строгое шифрованное имя.
Что такое assembly manifest?
В чем разница между понятиями namespace и assembly?
В чем различие между Value Type и Reference Type?
Когда объект удаляется сборщиком мусора?
Что такое Code Access Security (CAS)?
Что такое attribute?
Как обеспечить использование именованных параметров в конструкторе атрибута?
Если именованные параметры передаются, то они обязательно должны идти следом за позиционными параметрами, которые явно указаны в конструкторе атрибута.
Указание именованных параметров не является обязательным, поэтому при проектировании атрибутов необходимо помнить о том, что некоторые его поля или свойства могут быть не проинициализированы.
Пример использования именованных параметров в конструкторе атрибута:
[DllImport("Kernel32", CharSet=CharSet.Auto, SetLastError=true)] |
В чем различие между Finalize и Dispose?
Что такое Reflection?
Рассмотрим простой пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Animal { public void Eat() { Console.WriteLine("The animal eats."); } } Animal an = new Animal(); an.Eat(); Type animalType = typeof(Animal); if(animalType != null) { ConstructorInfo ci = animalType.GetConstructor(new Type[]{}); object animalReflected = ci.Invoke(new object[]{}); } |
Далее создается экземпляр класса и вызывается метод Eat.
После этого делается попытка получить метаданные, описывающие класс Animal. Эти данные заносятся в переменную animalType.
Если данные получены, переменной ci мы присваиваем ссылку на конструктор.
Далее, используя отражение, вызывается конструктор, который возвращает ссылку на созданный объект.
Теперь мы можем привести переменную animalReflected к типу Animal и пользоваться методами этого класса напрямую.
Что такое Boxing и Unboxing?
1. Выделяется память в управляемой куче.
2. Совершается копирование полей размерного типа в память, которая была выделена в куче.
3. Возвращается адрес объекта.
Некоторые компиляторы автоматически создают IL-код, необходимый для упаковки объекта размерного типа.
Процесс извлечения адреса полей из упакованного объекта называется распаковкой (unboxing). Распаковка не является полной противоположностью упаковке. В отличие от упаковки при распаковке не происходит никакого копирования. Однако обычно вслед за распаковкой следует копирование полей, поэтому обе операции (распаковка и копирование) являются противоположностью операции упаковки.
Приведем пример использования упаковки и распаковки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Объявляем размерный тип. struct Point { public Int32 x, у; } class App { static void Main() { ArrayList a = new ArrayList(); Point p; // Выделяется память для Point (не в куче). for (Int32 i = 0 ; i < 10; i++) { p.x = p. у = i; // Инициализация членов в нашем размерном типе. a.Add(p); // Упаковка размерного типа и добавление ссылки в ArrayList. } Point р1 = (Point) a[0]; // распаковка и копирование полей } |
Упаковка и распаковка/копирование снижают производительность приложения как в плане замедления, так и в расходе дополнительной памяти, поэтому нужно стараться минимизировать создание кода, в котором происходят операции упаковки и распаковки/копирования.
Что такое GAC?
В GAC можно поместить только сборки со строгими именами. Для того, чтобы поместить сборку в GAC, используют специальный инструмент GACUtil.exe, который знает всю внутреннюю структуру GAC и может генерировать имена подкаталогов надлежащим образом.
Регистрировать в GAC сборки необходимо для того, чтобы избежать конфликтов имен сборок.
Приведем пример: две компании выпустили сборку и назвали ее одним именем Calculus. Если мы скопируем эту сборку в каталог, в котором уже находится сборка с таким же именем, то мы затрем сборку, которая ранее могла использоваться каким-то приложением.
Это приложение с новой сборкой теперь работать не сможет.
Решением этой проблемы будет регистрация этих двух сборок в GAC, в котором для каждой будет создан отдельный каталог.
|
|
0 | Tweet | Нравится |
|
На этот раздел с вопросами оставлен 1 комментарий
-
Deimos
23 Июнь 2010 10:23:35 (ссылка)ValueType может попасть в кучу в двух случаях: если он является полем ссылочного типа и при необходимости операции упаковки, которая производится при необходимости преобразования типа значения в ссылочный тип (приведение к Object, получение интерфейсной ссылки).
По распаковке приведённый пример крайне неудачный, да и средство, при помощи которого демонстрируется это, является давно устаревшим. Более просто упаковка и распаковка иллюстрируются таким примером:
int a = 10; Object b = a; // boxing IComparable c = a; // boxing int d = (int)a; // unboxing






