Структурные\ссылочные типы

Типы данных в.NET

В первых языках программирования отсутвовало понятие класса, поэтому рассматривались только типы данных. При определении типа явно задавалось множество возможных значений, которые могу принимать переменные этого типа. Неявно с типом всегда связывался набор разрешенных операций. Определение класса наряду с описанием данных содержит четкое определение операций и методов применимых к данным. Объекты экземпляра класса являются обобщением понятия переменной. В .NET определения типа данных стало полностью аналогичным определению класса. Класс в .NET содержит

1) Данные (закрытые или открытые);

2) Свойства (данные, доступные на этапе проектирования);

3) Методы, определяющие поведение объектов класса;

4) События, которые могут происходить с объектами класса.

Можно считать, что класс это хорошоопределенный тип данных. Соответственно объект — это хорошо определенная переменная. Таким образом в .NET отсутвуют различая между типом и классом. Все типы (встроенные и пользовательские) одновременно являются и классами, связанными отношением наследования. Родительским (базовым) классом является класс Object.

Типы данных разделяются на

1) Статические;

2) Динамические.

Для статических данных память отводится в момент объявления и тербуемый размер памяти известен.

Для динамических данных их размер в момент объявления неизвестен и память им выделяется динамически по запросу в процессе выполнения программы.

Все типы в .NET разделяются на две осноные разновидности.

1) Структурные

2) Ссылочные

Использование типов значений (структурных) всегда связано с копированием их значений. Работа со ссылочными типами осуществляется через адреса их значений. Структурные типы используются для улучшения производительности программы. К структурным типам относятся все числовые типы данных, а также перечесления и структуры. Тип значения не может наследоваться от другого типа. Память для структурного типа выделяется из стека. При присвоении одного структурного типа другому — присваивается не адрес, а побитовая копия данных. Ссылочные типы описывают объектные ссылки, которые представляют собой адреса объектов. Память для них выделяется в динамической памяти которая называется также «Кучей». При присваивании копируется только адресс, а не само значение. Ссылочные типы являются объекты сборки мусора. В процессе работы программы иногда возникает необходимость преобразовать ссылочные данные в структурные и наоборот. Например, в контейнерные классы, которые определены в .NET нельзя поместить объект значения, поскольку в качестве элементов этих классов используются объекты типа Object. В .NET предусмотрено автоматическое преобразование типов, которое реализуется при помощи опреаций распаковки и упаковки. Две двойственные операции позволяют в зависимости от контекста значимые типы рассматривать как ссылочные и наоборот. Упаковка это процесс явного преобразования структурного типа в ссылочный. При этом в управляемой «Куче» создается новый объект и в него копируется внутренние данные объекта из стека. Распаковка это преобразование ссылки на объект, расположенного в динамической памяти в структурный тип. Перед выполнением распаковки среда проводит проверку на совместимость между типом объекта в динамической памяти и структурным типом. При попытке распаковки в несоответствующий тип данных будет сгенерировано Exception. Операция распаковки в строгом смысле слова не является обратной к операции упаковки.

Пусть Т — структурный тип.

T x;

object obj=x; \\Упаковка в ссылочный тип

\\Обратная операция

x=obj; \\приведет к ошибке, поскольку недостаточно совпадения типов. В этом случае \\необходимо явное преобразование.

x=(T)obj;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: