Читайте также:
|
|
Преобразование значимого типа в ссылочный позволяет выполнить упаковка (boxing). При упаковке экземпляра значимого типа происходит следующее.
1. В управляемой куче выделяется память. Ее объем определяется длиной значимого типа и двумя дополнительными членами, необходимыми для всех объектов в управляемой куче, — указателем на объект-тип и индексом SyncBlocklndex.
2. Поля значимого типа копируются в память, выделенную только что в куче.
3. Возвращается адрес объекта. Этот адрес является ссылкой на объект; значимый тип превратился в ссылочный.
Некоторые компиляторы, например компилятор С#, автоматически создают IL-код, необходимый для упаковки экземпляра значимого типа.
Распаковка в два этапа. Сначала извлекается адрес полей Point из упакованного объекта Point. Этот процесс называют распаковкой (unboxing). Затем значения полей копируются из кучи в экземпляр значимого тина, находящийся в стеке.
При распаковке ссылочного типа происходит следующее.
1. Если переменная, содержащая ссылку на упакованный значимый тип, равна null, генерируется исключение NullReferenceException.
2. Если ссылка указывает на объект, не являющийся упакованным значением требуемого значимого типа, генерируется исключение InvalidCastException
Когда выполняется распаковка объекта, должно быть сделано приведение к неупакованному типу.
C# имеет унифицированную систему типов, таким образом, значение любого типа может интерпретироваться как объект. Любой тип в C#, прямо или косвенно, является наследником класса object. Ссылочные типы рассматриваются как простые объекты типа object. Типы-значения - как результат выполнения операции приведения типов. Типы данных в C# разделяются на ссылочные типы и типы-значения. К типам-значениям относятся: – Простые • целочисленные (int - 32 бита, long - 64 бита) • char (16 бит, Unicode) • типы с плавающей точкой (могут выдавать обычные значения, +0, -0, +∞, -∞, NaN) • decimal (128-бит, с точностью до 28 знаков) – Структурные – Перечислимые: enum Days { Mon=1, Tue … }, по умолчанию типа int. К типам-значениям относится широкий набор примитивных типов данных, включая целые числа различной разрядности, типы с плавающей запятой различной точности, специальный тип decimal с фиксированной точностью, предназначенный для финансовых вычислений, а также символьный тип char, способный хранить символы в формате Unicode и потому удобный при разработке интернациональных приложений. Все целочисленные типы существуют в двух вариантах: знаковом и беззнаковом. Важной особенностью переменных с плавающей запятой является то, что операции над ними никогда не производят исключений, но зато результатом работы с ними могут быть значения ±∞ (как результат деления на ноль) или нечисловым значением, NaN (Not-ANumber, как результат деления 0 на 0 или операций, в котором один из операндов уже равняется NaN). Отметим, что C# содержит также специальный тип для булевских значений; переменные булевского типа могут содержать значения true или false, но в отличие от большинства современных языков программирования этим значениям не соответствует никаких численных эквивалентов Ссылочные типы • Тип object (для упаковки значений) • Тип class • Интерфейсы • Представители delegates) • Тип string • Массивы. Интерфейс представляет собой ссылочный тип, который может иметь только абстрактные элементы (аналогично методам, равным нулю, в С++). В частности, с помощью интерфейсов можно реализовать механизм множественного наследования — для этого необходимо унаследовать класс от нескольких элементов и затем явным образом реализовать заявленную функциональность. Представители (delegates) являются относительно безопасной версией указателей на функции: окружение.NET гарантирует, что представители указывают именно на допустимый объект, а не просто на некоторый адрес в памяти. Основные области применения представителей — это методы обратного вызова и асинхронные обработчики событий. Строки в C# являются полноценным ссылочным типом, но при этом обладают семантикой сравнений, характерной для типов-значений (т.е. строки равны, если равны их значения). Это можно проиллюстрировать следующим примером. Массивы в С# бывают двух типов: многомерные (например, int [,,] определяет трехмерный массив) и невыровненные (они же массивы массивов, используемые в С++; например, int [] [] определяет двухмерный массив). Несмотря на простой внешний вид, массивы являются полноценными объектами, представляющими класс System.Array. Упаковка-преобразование представляет собой процесс преобразования типа значения в тип object или любой другой тип интерфейса, реализуемый этим типом значения. Когда тип значения упаковывается средой CLR, она создает программу-оболочку значения внутри System.Object и сохраняет ее в управляемой куче. Операция распаковки-преобразования извлекает тип значения из объекта.
8. Ссылочные типы данных. Объектная модель в среде.NET и языке C#.
Объектная модель представления данных оперирует такими понятиями, как класс и объект. Классы определяют структуру данных и представляют собой набор атрибутов (текстовая строка, целое число, изображение и т.д.). Представители класса (объекты) имеют определенную структуру и могут содержать другие объекты, образуя произвольную иерархическую структуру. Объекты могут наследовать свойства, содержание и поведение объектов, которые в них содержатся.
Дата добавления: 2015-01-30; просмотров: 144 | Поможем написать вашу работу | Нарушение авторских прав |