Опубликован: 19.08.2004 | Уровень: для всех | Доступ: платный | ВУЗ: Национальный исследовательский ядерный университет «МИФИ»
Лекция 7:

Теория типов и типизация в .NET

Таблица 18.1. Ссылочные типы и типы-значения в .NET и C#.
Типы-значения
Элементарные 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();
Иерархия типов языка C# (фрагмент).

Рис. 18.2. Иерархия типов языка C# (фрагмент).

Многообразие типов можно разделить на предопределенные (заранее заданные системой программирования) и определенные пользователем (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 обеспечивает безопасную типизацию, т.е. гарантирует отсутствие побочных эффектов (переполнение оперативной памяти компьютера, некорректное преобразование типов и т.д.). Заметим также, что как явные, так и неявные преобразования типов могут инициироваться пользователем.