Украина |
Теория типов и типизация в .NET
Типы-значения | |
---|---|
Элементарные | int i; float x; |
Перечислимые | enum State { Off, On } |
Структурные | struct Point {int x,y;} |
Типы-ссылки | |
Корневые | object |
Строковые | string |
Классы | class Foo: Bar, IFoo {...} |
Интерфейсы | interface IFoo: IBar {...} |
Массивы | string[] a = new string[10]; |
Делегаты | delegate void Empty(); |
Проиллюстрируем иерархию системы типов Common Type System программной среды Microsoft .NET примерами из языка программирования C#, конкретизирующими подтипы для типов-значений и ссылочных типов (см. табл. 18.1):
При этом типы-значения распадаются на следующие подтипы:
-
элементарные (в частности, целочисленные и вещественные):
int i; float x;
-
перечислимые (в частности, моделирующие переключатели):
enum State {Off, On}
-
структурные (в частности, моделирующие точки на плоскости):
struct Point {int x,y;}
В свою очередь, ссылочные типы подразделяются на следующие подтипы:
- корневой подтип (указатели на произвольные объекты в иерархии типов в Common Type System):
object
-
строковые (указатели на строки символов):
string
-
классы (указатели на объекты типа class):
class Foo: Bar, IFoo {...}
-
интерфейсы (указатели на объекты типа interface):
interface IFoo: IBar {...}
-
массивы (в частности, указатели на строки из 10 символов):
string[] a = new string[10];
-
делегаты (усовершенствованные указатели на функцию):
delegate void Empty();
Многообразие типов можно разделить на предопределенные (заранее заданные системой программирования) и определенные пользователем (user defined), см. рис. 18.2.
К последним относятся перечисления, массивы, классы, интерфейсы и делегаты (указатели на функцию).
Предопределенные типы делятся на ссылочные типы (объекты и символьные строки) и типы-значения (встроенные - короткие и длинные целые со знаком и без знака, а также числа с плавающей точкой - с одинарной и двойной точностью).
Как уже отмечалось, над элементами типов могут осуществляться преобразования из одного типа данных в другой (например, из строки в число или наоборот). При этом такие преобразования могут инициироваться как программистом (т.е. происходить явно), так и системой программирования (т.е. происходить неявным образом).
Неявные преобразования инициируются Common Type System и производятся автоматически. При этом результат неявного преобразования всегда успешен и не приводит к потере точности.
Явные преобразования инициируются программистом или пользователем приложения, а следовательно, требуют явного вызова и при этом могут завершаться ошибкой, а также приводить к потере точности.
Приведем ряд примеров преобразований типов на языке программирования C#:
int x = 25; long y = x; // неявное short z = (short) x; // явное double d = 3.141592536; float f = (float) d; // явное long l = (long) d; // явное
Заметим, что система Common Type System среды Microsoft .NET обеспечивает безопасную типизацию, т.е. гарантирует отсутствие побочных эффектов (переполнение оперативной памяти компьютера, некорректное преобразование типов и т.д.). Заметим также, что как явные, так и неявные преобразования типов могут инициироваться пользователем.