145
Примитивные.типы.в.языках.программирования
кто-то
возьмется читать код, написанный на новом для себя языке, то назначение
кода может быть неверно им истолковано. Многим языкам незнакомо ключевое
слово
long
, и их
компиляторы не пропустят код, где оно встречается.
У многих FCL-типов есть методы, в имена которых включены имена типов. На-
пример, у типа
BinaryReader
есть
методы
ReadBoolean
,
ReadInt32
,
ReadSingle
и т. д., а у типа
System.Convert
— методы
ToBoolean
,
ToInt32
,
ToSingle
и т. д.
Вот вполне приемлемый код, в котором строка, содержащая
float
,
выглядит
неестественно; даже возникает впечатление, что код ошибочен:
BinaryReader br = new BinaryReader(...);
float val = br.ReadSingle(); // Код правильный, но выглядит странно
Single val = br.ReadSingle(); // Код правильный и выглядит нормально
Многие программисты, пишущие исключительно на С#, часто забывают, что
в CLR могут применяться и другие языки программирования.
Например, среда
FCL практически полностью написана на С#, а разработчики из команды FCL
ввели в библиотеку такие методы, как
метод
GetLongLength
класса
Array
, воз-
вращающий значение
Int64
, которое имеет тип
long
в С#, но не в других языках
программирования (например, C++/CLI). Другой пример — метод
LongCount
класса
System.Linq.Enumerable
.
По этим причинам я буду использовать в этой книге только имена FCL-типов.
Во многих языках программирования следующий код благополучно скомпи-
лируется и выполнится:
Int32 i = 5; // 32-разрядное число
Int64 l = i; // Неявное приведение типа к 64-разрядному значению
Однако
если вспомнить, что говорилось о приведении типов в главе 4, можно
решить, что он компилироваться не будет. Все-таки
System.Int32
и
System.Int64
,
не являются производными друг от друга. Могу вас обнадежить: код успешно ком-
пилируется и делает все, что ему положено.
Дело в том, что компилятор C# неплохо
разбирается в примитивных типах и применяет свои правила при компиляции кода.
Иначе говоря, он распознает наиболее распространенные шаблоны программиро-
вания и генерирует такие IL-команды, благодаря которым исходный код работает
так, как требуется. В первую очередь, это
относится к приведению типов, литералам
и операторам, примеры которых мы рассмотрим позже.
Начнем с того, что компилятор выполняет явное и неявное приведение между
примитивными типами, например:
Int32 i = 5; // Неявное приведение Int32 к Int32
Int64 l = i; // Неявное приведение Int32 к Int64
Single s = i; // Неявное приведение Int32 к Single
Byte b = (Byte) i; // Явное приведение Int32 к Byte
Int16 v = (Int16) s; // Явное приведение Single к Int16
C# разрешает неявное приведение типа, если это преобразование «безопасно»,
то есть не
сопряжено с потерей данных; пример — преобразование из
Int32
в
Int64
.