Вопросы на собеседовании
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 | Нравится |
|
На этот раздел с вопросами оставлено 3 комментария
-
Deimos
23 Июнь 2010 10:23:35 (ссылка)ValueType может попасть в кучу в двух случаях: если он является полем ссылочного типа и при необходимости операции упаковки, которая производится при необходимости преобразования типа значения в ссылочный тип (приведение к Object, получение интерфейсной ссылки).
По распаковке приведённый пример крайне неудачный, да и средство, при помощи которого демонстрируется это, является давно устаревшим. Более просто упаковка и распаковка иллюстрируются таким примером:
int a = 10; Object b = a; // boxing IComparable c = a; // boxing int d = (int)a; // unboxing
-
Dron
16 Май 2013 13:46:08 (ссылка)"Объект удаляется сборщиком мусора, когда на него не остается ссылок."
Если быть более точным, то
"Объект удаляется сборщиком мусора после того, как на него не остается ссылок."
По той простой причине, что далеко не всегда сборщик мусора очищает память прямо-таки сразу после последнего использования объекта. А в высокопроизводительных системах это вообще отдельная головная боль, когда приходится придумывать способы "взбодрить" сборщика мусора, дабы освободить ресурсы. -
Taras
14 Сентябрь 2015 14:12:06 (ссылка)"приходится придумывать способы "взбодрить" сборщика мусора, дабы освободить ресурсы"
Для этого существует статический метод GC.Collect()