Система типов
Язык программирования предполагает наличие правил построения корректных предложений. В свою очередь, предложения строятся из выражений. Основной характеристикой выражения является значение этого выражения. Можно утверждать, что выполнение программы состоит из вычисления значений выражений, которые образуют предложения программы. Синтаксис языка не ограничивает сложности выражения. Выражение может состоять из очень большого количества более простых (элементарных) выражений.
Значение выражения характеризуется типом (типом выражения). Выражение сложной структуры может сочетать элементарные выражения различных типов. При вычислении значений таких выражений требуются дополнительные усилия по преобразованию значений одного типа в значения другого типа. Большая часть этой работы производится автоматически, в ряде случаев от программиста требуются дополнительные усилия по разработке алгоритмов преобразования.
При разработке кода любой сложности знание правил кодирования, вычисления и преобразования значений различных типов является условием создания правильно выполняемой программы.
В разделах этой главы обсуждаются система типов и основные характеристики категорий типов, литералы которые являются основным средством кодирования значений в выражениях, проблемы преобразования значений в выражениях, операторы объявления и связанная с ними проблема области действия имени.
Категории типов
Система типов включает несколько категорий типов:
- типы значений (типы-значения),
- ссылочные типы (типы-ссылки),
- параметризованные типы (типы-шаблоны).
Схема типов представлена ниже.
Простые (элементарные) типы – это типы, имя и основные свойства которых известны компилятору. Относительно элементарных типов компилятору не требуется никакой дополнительной информации. Свойства и функциональность этих типов известны.
Среди простых типов различаются:
- ЦЕЛОЧИСЛЕННЫЕ,
- С ПЛАВАЮЩЕЙ ТОЧКОЙ,
- DECIMAL,
- БУЛЕВСКИЙ.
Некоторые характеристики простых (элементарных) типов отражены в следующей таблице. Используемые в .NET языки программирования основываются на общей системе типов. Между именами простых типов в C# и именами типов, объявленных в Framework Class Library, существует взаимно однозначное соответствие. Смысл точечной нотации в графе "Соответствует FCL-типу" состоит в явном указании пространства имен, содержащего объявление соответствующего типа:
Ниже представлены основные отличия ссылочных типов и типов-значений.
Типы-значения | Типы-ссылки | |
---|---|---|
Объект представлен | непосредственно значением | ссылкой в стеке или куче |
Объект располагается | в стеке или куче | в куче |
Значение по умолчанию | 0, false, ' \0 ', null | ссылка имеет значение null |
При выполнении операции присваивания копируется | значение | ссылка |
В C# объявление любой структуры и класса основывается на объявлении предопределенного класса object (наследует класс object ). Следствием этого является возможность вызова от имени объектов — представителей любой структуры или класса, унаследованных от класса object методов. В частности, метода ToString. Этот метод возвращает строковое (значение типа string ) представление объекта.
Все типы (типы-значения и типы-ссылки), за исключением простых типов-значений и пары предопределенных ссылочных типов ( string и object ), должны определяться (если уже не были ранее специально определены) программистами в рамках объявлений. Подлежащие объявлению типы называются производными типами.
В разных CLS-языках типам, удовлетворяющим CLS-спецификации, будут соответствовать одни и те же элементарные типы.
Система встроенных типов C# основывается на системе типов .NET Framework Class Library. При создании IL-кода компилятор осуществляет их отображение в типы из .NET FCL.
Параметризованные типы занимают особое место в системе типов и обсуждаются позже.
object и string: предопределенные ссылочные типы
Итак, к ссылочным типам относятся:
- классы;
- интерфейсы;
- массивы;
- делегаты.
Для каждой категории ссылочных типов существуют собственные правила объявления. Объявления классов вводятся ключевым словом class. Правила объявления классов (как и правила объявления других ссылочных типов, а также типов-значений, объявляемых с помощью ключевого слова struct ) позволяют объявлять неограниченное множество разнообразных ссылочных типов и структур.
Среди множества классов выделяют предопределенные ссылочные типы object и string, которым соответствуют FCL-типы System.Object и System.String. Свойства, функциональность и особенности применения этих типов рассматриваются ниже.