
- •1. Понятие информационной системы (ис). Корпоративные ис. Структура ис.
- •2. Понятие информационной системы (ис). Корпоративные ис. Классификация ис.
- •3. История развития ис.
- •4. .Net Framework. Общеязыковая среда исполнения (clr). Управляемые модули и сборки.
- •5. .Net Framework. Общая система типов (cts) и Общеязыковая спецификация (cls).
- •6. .Net Framework. Механизм сборки мусора.
- •7. C#. Объявление класса.
- •8. Java. Объявление класса.
- •9. C#. Делегаты.
- •10. C#. События.
- •11. C#. Наследование: правила, синтаксис. Сокрытие имен.
- •12. Java. Наследование: правила, синтаксис. Сокрытие имен.
- •13. Правила наследования типов. Принцип «Open-Closed Principle».
- •14. Правила наследования типов. Принцип «Liskov Substitution Principle».
- •15. C#. Приведение типов. Операторы as и is.
- •16. C#. Виртуальные и невиртуальные методы. Статические методы.
- •17. C#. Абстрактные и конечные методы.
- •310 Часть I. Язык с#
- •18. Java. Абстрактные, виртуальные, конечные и статические методы.
- •19. C# и Java. Интерфейсы.
- •20.C#. Структуры.
- •21. C#. Перечисления.
- •22.C#. Упаковка и распаковка объектов значимых типов.
- •23.C# и Java. Исключения. Механизм исключений.
- •24.C# и Java. Исключения. Классы исключений.
- •25.C# и Java. Исключения. Основные принципы использования механизма
- •26.C#. Обобщения: понятие и синтаксис. Ограничения обобщений.
- •27. Java. Обобщения: понятие и синтаксис.
- •28.C#. Коллекции.
- •29.Java. Коллекции.
- •30.C#. Dispose Pattern.
- •31. .Net Framework 3.0, 3.5, 3.5 sp1: общая характеристика.
- •32. C# 3.0, linq: обзор.
- •Источники данных
- •SqlMetal
- •33. Понятие жизненного цикла ис (жц ис). Каскадная модель жц ис.
- •34. Понятие жизненного цикла ис (жц ис). Спиральная модель жц ис.
- •35. Анализ требований. Функциональные и нефункциональные требования.
- •36 Требования и прецеденты. Формат описания прецедента. Структура прецедента.
- •37 Требования и прецеденты. Взаимосвязь прецедентов.
- •38 Модель предметной области. Концептуальные классы. Ассоциации и атрибуты.
- •39 Язык uml. Способы использования. Model Driven Architecture. Executable uml. ДиаграммыUml.
- •40 Диаграмма прецедентов.
- •41. Диаграмма классов. Обозначение классов. Отношение ассоциации.
- •42.Диаграмма классов. Обозначение интерфейсов. Отношение обобщения и зависимости.
- •43.Диаграмма объектов.
- •44.Диаграмма пакетов.
- •45.Диаграмма состояний.
- •46.Диаграмма развертывания.
- •49.Диаграмма коммуникации.
- •50.Паттерн: понятие, структура, классификация.
- •1) Понятие паттерна
- •2) Структура и Классификация паттернов
- •51. Проектирование на основе обязанностей. Принципы grasp.
- •52.Grasp: принцип Low Coupling.
- •53.Grasp: принцип High Cohesion.
- •54.Grasp: принцип Information Expert.
- •55. Grasp: принцип Creator.
- •56.Grasp: принцип Pure Fabrication.
- •57. Grasp: принцип Indirection.
- •59.Grasp: принцип Protected Variations.
- •60.Grasp: принцип Controller.
22.C#. Упаковка и распаковка объектов значимых типов.
Упаковка (boxing) – получение ссылки на объект значимого типа:
выделение в управляемой куче памяти
копирование полей значимого типа
возврат адреса объекта
C# сам генерирует код упаковки
Point p = new Point();
ArrayList list = new ArrayList();
for (int i = 0; i < 10; ++i)
{
p.X = p.Y = i;
list.Add(p); упаковка
}
Распаковка (unboxing) – получение объекта значимого типа по ссылке на его упакованную форму
при распаковке не происходит копирования
но чаще всего копирование происходит вслед за распаковкой
Point p = (Point)list[0];
p.X = p.Y = 0;
Object o = p;
((Point)o).Offset(1, 1);
Console.WriteLine(o);
Упаковка-преобразование представляет собой процесс преобразования типа значения в тип object или любой другой тип интерфейса, реализуемый этим типом значения. Когда тип значения упаковывается средой CLR, она создает программу-оболочку значения внутри System.Object и сохраняет ее в управляемой куче. Операция распаковки-преобразования извлекает тип значения из объекта. В следующем примере выполнена операция упаковки-преобразования целочисленной переменой i, которая присвоена объекту o.
Язык C#
int i = 123;
object o = (object)i; // boxing
Можно затем выполнить операцию распаковки-преобразования объекта o и назначить его целочисленной переменной i:
Язык C#
o = 123;
i = (int)o; // unboxing
Производительность
По сравнению с простыми операциями присваивания операции упаковки-преобразования и распаковки-преобразования являются весьма затратными процессами с точки зрения вычислений. При выполнении упаковки-преобразования типа значения необходимо создать и разместить новый объект. Объем вычислений при выполнении операции распаковки-преобразования, хотя и в меньшей степени, но тоже весьма значителен. Дополнительные сведения см. в разделе Производительность.
Упаковка–преобразование
Упаковка используется для хранения типов значений в куче "сбора мусора". Упаковка представляет собой неявное преобразование типа значения в тип object или любой другой тип интерфейса, реализуемый этим типом значения. При упаковке типа значения в куче выделяется экземпляр объекта и выполняется копирование значения в этот новый объект.
Рассмотрим следующее объявление переменной типа значения.
Язык C#
int i = 123;
Следующий оператор неявно применяет операцию упаковки к переменной i.
Язык C#
object o = i; // Implicit boxing
Результат этого оператора создает ссылку на объект o в стеке, которая ссылается на значение типа int в куче. Это значение является копией значения типа значения, назначенного переменной i. Разница между двумя этими переменными, i и o, продемонстрирована на рисунке ниже.
Упаковка-преобразование
Можно также выполнять упаковку явным способом, как в следующем примере, однако явная упаковка не является обязательной.
Язык C#
int i = 123;
object o = (object)i; // explicit boxing
Описание
Этот пример преобразует целочисленную переменную i в объект o при помощи упаковки. Затем значение, хранимое переменной i, меняется с 123 на 456. В примере показано, что исходный тип значения и упакованный объект используют отдельные ячейки памяти, а значит, могут хранить разные значения.
Пример
Язык C#
class TestBoxing
{
static void Main()
{
int i = 123;
object o = i; // Implicit boxing
i = 456; // Change the contents of i
System.Console.WriteLine("The value-type value = {0}", i);
System.Console.WriteLine("The object-type value = {0}", o);
}
}
/* Output:
The value-type value = 456
The object-type value = 123*/
В следующем примере показан случай недопустимого процесса распаковки, в результате которого вызывается InvalidCastException. При использовании try и catch, когда возникает ошибка, выводится сообщение об ошибке.
Язык C#
class TestUnboxing
{
static void Main()
{
int i = 123;
object o = i; // implicit boxing
try
{
int j = (short)o; // attempt to unbox
System.Console.WriteLine("Unboxing OK.");
}
catch (System.InvalidCastException e)
{
System.Console.WriteLine("{0} Error: Incorrect unboxing.", e.Message);
}
}
}
При выполнении этой программы выводится следующий результат:
Specified cast is not valid. Error: Incorrect unboxing.
При изменении оператора
int j = (short) o;
на:
int j = (int) o;
будет выполнено преобразование со следующим результатом.
Unboxing OK.
Распаковка-преобразование
Распаковка является явным преобразованием из типа object в тип значения или из типа интерфейса в тип значения, его реализующее. Операция распаковки состоит из следующих действий.
Проверка экземпляра объекта на то, что он является упакованным значением заданного типа значения.
Копирование значения из экземпляра в переменную типа-значения.
В следующих операторах показаны операции по упаковке и распаковке.
Язык C#
int i = 123; // a value type
object o = i; // boxing
int j = (int)o; // unboxing
На следующем рисунке представлен результат выполнения предыдущих операторов.
Распаковка-преобразование
Для успешной распаковки типов значений во время выполнения необходимо, чтобы экземпляр, который распаковывается, был ссылкой на объект, предварительно созданный с помощью упаковки экземпляра этого типа значения. Попытка распаковать null или ссылку в несовместимый тип значения вызовет InvalidCastException.