Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Struct MyStruct : IMyInterface




Interface IMyInterface

Class MyStruct

Struct MуStruct

Упаковка и распаковка

Упаковка — это процедура преобразования значимого типа в тип system.object либо в тип интерфейса, который реализован значимым типом. Распаковка является обратной процедурой.

Предположим, что имеется структура следующего типа:

{

public int Val;

}

Мы можем выполнить упаковку этой структуры, поместив ее в переменную типа object:

MyStruct valType1 = new MyStruct();

valType1.Val = 5;

object refType = valType1;

Здесь мы создаем новую переменную (valType1) типа MyStruct, присваиваем ей значение, а затем осуществляем ее упаковку в переменную типа object (refType). В этом объекте, созданном в результате упаковки переменной, содержится ссылка на копию переменной значимого типа, а не ссылка на исходную переменную значимого типа. Это можно проверить, изменив содержимое исходной структуры, выполнив распаковку структуры, которая содержится в переменной типа object, и сравнив их значения:

valType1.Val = 6;

MyStruct valType2 = (MyStruct)refType;.

Console.WriteLine(“valType2.Val = (0)”, valType2.Val);

В результате выполнения этого кода будет получен следующий результат:

valType2.Val = 5

В том случае, когда объекту присваивается переменная ссылочного типа, то все происходит совсем иначе. Это можно проиллюстрировать, описав MyStruct как класс (проигнорировав тот факт, что имя этой переменной оказывается несколько неподходящим для класса):

{

public int Val;

}

Запустив приведенный выше клиентский код без каких бы то ни было изменений (по-прежнему игнорируя некорректно названные переменные), мы получим следующий выходной поток:

valType2.Val = 6

Также можно осуществлять упаковку переменных в интерфейс, если этот интерфейс в них реализован. Предположим, что тип MyStruct реализует интерфейс IMyInterface следующим образом:

{

}

{

public int Val;

}

В таком случае можно выполнить упаковку этой структуры в тип IMyInterface:

MyStruct valType1 = new MyStruct();

IMyInterface refType =valType1;

и ее распаковку с использованием обычного приведения типа:

MyStruct valType2 =(MyStruct)refType;

Как можно заметить по этим примерам, процедура упаковки выполняется без вмешательства с нашей стороны (другим словами, отсутствует необходимость писать какой-либо код). А вот процедура распаковки требует выполнения явного преобразования типов, т. е. нужно выполнить приведение типа (упаковка выполняется неявно и таких требований не предъявляет).

Возможно, вы недоумеваете, для чего все это может понадобиться. На самом деле существуют две причины считать процедуру упаковки чрезвычайно полезной. Во-первых, она позволяет использовать значимые типы в семействах (например, в ArrayList), в которых собраны элементы ссылочного типа. Во-вторых, она представляет собой некий внутренний механизм, позволяющий вызывать методы типа object для значимых типов вроде int или struct.

И последнее замечание, которое необходимо сделать: выполнение процедуры распаковки является необходимым условием для осуществления доступа к содержимому значимых типов.




Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 318; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.