Типы данных в.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;