Система типов
Автор: admin | 20 Июнь 2008 – 20:47 -Система типов
Давайте рассмотрим, как устроена система типов в языке C#, но вначале для сравнения приведу классификацию типов в стандарте языка C++.
Стандарт языка C++ включает следующий набор фундаментальных типов.
- Логический тип (bool).
- Символьный тип (char).
- Целые типы. Целые типы могут быть одного из трех размеров – short, int, long, сопровождаемые описателем signed или unsigned, который указывает, как интерпретируется значение, – со знаком или без оного.
- Типы с плавающей точкой. Эти типы также могут быть одного из трех размеров – float, double, long double.
Кроме того, в языке есть
- Тип void, используемый для указания на отсутствие информации.
Язык позволяет конструировать типы.
- Указатели (например, int* – типизированный указатель на переменную типа int).
- Ссылки (например, double& – типизированная ссылка на переменную типа double).
- Массивы (например, char[] – массив элементов типа char).
Язык позволяет конструировать пользовательские типы
- Перечислимые типы (enum) для представления значений из конкретного множества.
- Структуры (struct).
- Классы.
Первые три вида типов называются интегральными или счетными. Значения их перечислимы и упорядочены. Целые типы и типы с плавающей точкой относятся к арифметическому типу. Типы подразделяются также на встроенные и типы, определенные пользователем.
Эта схема типов сохранена и в языке C#. Однако здесь на верхнем уровне используется и другая классификация, носящая для C# принципиальный характер. Согласно этой классификации все типы можно разделить на четыре категории:
- Типы-значения (value), или значимые типы.
- Ссылочные (reference).
- Указатели (pointer).
- Тип void.
Эта классификация основана на том, где и как хранятся значения типов. Для ссылочного типа значение задает ссылку на область памяти в “куче”, где расположен соответствующий объект. Для значимого типа используется прямая адресация, значение хранит собственно данные, и память для них отводится, как правило, в стеке.
В отдельную категорию выделены указатели, что подчеркивает их особую роль в языке. Указатели имеют ограниченную область действия и могут использоваться только в небезопасных блоках, помеченных как unsafe.
Особый статус имеет и тип void, указывающий на отсутствие какого-либо значения.
В языке C# жестко определено, какие типы относятся к ссылочным, а какие – к значимым. К значимым типам относятся: логический, арифметический, структуры, перечисление. Массивы, строки и классы относятся к ссылочным типам. На первый взгляд, такая классификация может вызывать некоторое недоумение, почему это структуры, которые в C++ близки к классам, относятся к значимым типам, а массивы и строки – к ссылочным. Однако ничего удивительного здесь нет. В C# массивы рассматриваются как динамические, их размер может определяться на этапе вычислений, а не в момент трансляции. Строки в C# также рассматриваются как динамические переменные, длина которых может изменяться. Поэтому строки и массивы относятся к ссылочным типам, требующим распределения памяти в “куче”.
Со структурами дело сложнее. Структуры C# представляют частный случай класса. Определив свой класс как структуру, программист получает возможность отнести класс к значимым типам, что иногда бывает крайне полезно. Замечу, что в хорошем объектном языке Eiffel программист может любой класс объявить развернутым (expanded), что эквивалентно отнесению к значимому типу. У программиста C# только благодаря структурам появляется возможность управлять отнесением класса к значимым или ссылочным типам. Правда, это неполноценное средство, поскольку на структуры накладываются дополнительные ограничения по сравнению с обычными классами.
Рассмотрим классификацию, согласно которой все типы делятся на встроенные и определенные пользователем. Все встроенные типы C# однозначно отображаются, а фактически совпадают с системными типами каркаса Net Framework, размещенными в пространстве имен System. Поэтому всюду, где можно использовать имя типа, например, – int, с тем же успехом можно использовать и имя System.Int32.
|
Замечание: Следует понимать тесную связь и идентичность встроенных типов языка C# и типов каркаса. Какими именами типов следует пользоваться в программных текстах – это спорный вопрос. Джеффри Рихтер в своей известной книге “Программирование на платформе Framework .Net” рекомендует использовать системные имена. Другие авторы считают, что следует пользоваться именами типов, принятыми в языке. Возможно, в модулях, предназначенных для межъязыкового взаимодействия, разумны системные имена, а в остальных случаях – имена конкретного языка программирования. |
В заключение этого раздела приведу таблицу (3.1), содержащую описание всех встроенных типов языка C# и их основные характеристики.
|
Логический тип |
|||
|
Имя типа |
Системный тип |
Значения |
Размер |
| Bool | System.Boolean | true, false | 8 бит |
|
Арифметические целочисленные типы |
|||
|
Имя типа |
Системный тип |
Диапазон |
Размер |
| Sbyte | System.SByte | -128 — 128 | Знаковое, 8 Бит |
| Byte | System.Byte | 0 — 255 | Беззнаковое, 8 Бит |
| Short | System.Short | -32768 —32767 | Знаковое, 16 Бит |
| Ushort | System.UShort | 0 — 65535 | Беззнаковое, 16 Бит |
| Int | System.Int32 | ?(-2*10^9 — 2*10^9) | Знаковое, 32 Бит |
| Uint | System.UInt32 | ?(0 — 4*10^9) | Беззнаковое, 32 Бит |
| Long | System.Int64 | ?(-9*10^18 — 9*10^18) | Знаковое, 64 Бит |
| Ulong | System.UInt64 | ?(0— 18*10^18) | Беззнаковое, 64 Бит |
|
Арифметический тип с плавающей точкой |
|||
|
Имя типа |
Системный тип |
Диапазон |
Точность |
| Float | System.Single | +1.5*10^-45 – +3.4*10^38 | 7 цифр |
| Double | System.Double | +5.0*10^-324 – +1.7*10^308 | 15-16 цифр |
|
Арифметический тип с фиксированной точкой |
|||
|
Имя типа |
Системный тип |
Диапазон |
Точность |
| Decimal | System.Decimal | +1.0*10^-28 – +7.9*10^28 | 28-29 значащих цифр |
|
Символьные типы |
|||
|
Имя типа |
Системный тип |
Диапазон |
Точность |
| Char | System.Char | U+0000 – U+ffff | 16 бит Unicode символ |
| String | System.String | Строка из символов Unicode | |
|
Объектный тип |
|||
|
Имя типа |
Системный тип |
Примечание |
|
| Object | System.Object | Прародитель всех встроенных и пользовательских типов | |
Система встроенных типов языка C# не только содержит практически все встроенные типы (за исключением long double) стандарта языка C++, но и перекрывает его разумным образом. В частности тип string является встроенным в язык, что вполне естественно. В области совпадения сохранены имена типов, принятые в C++, что облегчает жизнь тем, кто привык работать на C++, но собирается по тем или иным причинам перейти на язык C#.
Tags: Boolean, Eiffel, enum, Framework, NET, pointer, Reference, SByte, struct, System, void
Находится в Учебник | No Comments »
Ответить
Вы должны быть в системе, дабы комментировать.
