Полное руководство. С# 4.0 - Шилдт Герберт
Типы данных имеют особенное значение в С#, поскольку это строго типизированный язык. Это означает, что всеоперации подвергаются строгому контролю со стороныкомпилятора на соответствие типов, причем недопустимыеоперации не компилируются. Следовательно, строгий контроль типов позволяет исключить ошибки и повысить надежность программ. Для обеспечения контроля типов всепеременные, выражения и значения должны принадлежатьк определенному типу. Такого понятия, как "бестиповая"переменная, в данном языке программирования вообще несуществует. Более того, тип значения определяет те операции, которые разрешается выполнять над ним. Операция,разрешенная для одного типа данных, может оказаться недопустимой для другого.
ПРИМЕЧАНИЕВ версии C# 4.0 внедрен новый тип данных, называемый dynamic и приводящийк отсрочке контроля типов до времени выполнения, вместо того чтобы производить подобныйконтроль во время компиляции. Поэтому тип dynamic является исключением из обычногоправила контроля типов во время компиляции. Подробнее о типе dynamic речь пойдетв главе 17.Типы значений в C
В C# имеются две общие категории встроенных типов данных: типы значений и ссылочные типы. Они отличаются по содержимому переменной. Если переменная относится к типу значения, то она содержит само значение, например 3,1416 или 212.А если переменная относится к ссылочному типу, то она содержит ссылку на значение.Наиболее распространенным примером использования ссылочного типа являетсякласс, но о классах и ссылочных типах речь пойдет далее в этой книге. А здесь рассматриваются типы значений.
В основу языка C# положены 13 типов значений, перечисленных в табл. 3.1. Все ониназываются простыми типами, поскольку состоят из единственного значения. (Инымисловами, они не состоят из двух или более значений.) Они составляют основу системытипов С#, предоставляя простейшие, низкоуровневые элементы данных, которымиможно оперировать в программе. Простые типы данных иногда еще называют примитивными.
Таблица. 3.1. Типы значений в C#ТипЗначениеboolЛогический, предоставляет два значения: “истина” или “ложь”byte8-разрядный целочисленный без знакаcharСимвольныйdecimalДесятичный (для финансовых расчетов)doubleС плавающей точкой двойной точностиfloatС плавающей точкой одинарной точностиintЦелочисленныйlongДлинный целочисленныйsbyte8-разрядный целочисленный со знакомshortКороткий целочисленныйuintЦелочисленный без знакаulongДлинный целочисленный без знакаushortКороткий целочисленный без знака
В C# строго определены пределы и характер действия каждого типа значения.Исходя из требований к переносимости программ, C# не допускает в этом отношенииникаких компромиссов. Например, тип int должен быть одинаковым во всех средахвыполнения. Но в этом случае отпадает необходимость переписывать код для конкретной платформы. И хотя строгое определение размерности типов значений можетстать причиной незначительного падения производительности в некоторых средах, этамера необходима для достижения переносимости программ.
ПРИМЕЧАНИЕПомимо простых типов, в C# определены еще три категории типов значений: перечисления,структуры и обнуляемые типы. Все они рассматриваются далее в этой книге.Целочисленные типы
В C# определены девять целочисленных типов: char, byte, sbyte, short, ushort,int, uint, long и ulong. Но тип char применяется, главным образом, для представления символов и поэтому рассматривается далее в этой главе. Остальные восемьцелочисленных типов предназначены для числовых расчетов. Ниже представлены ихдиапазон представления чисел и разрядность в битах.ТипРазрядность в битахДиапазон представления чиселbyte80-255sbyte8-128-127short16-32 768-32 767ushort160-65 535int32-2 147 483 648-2 147 483 647uint320-4 294 967 295long64-9 223 372 036 854 775 808-9 223 372 036 854 775 807ulong640-18 446 744 073 709 551 615
Как следует из приведенной выше таблицы, в C# определены оба варианта различных целочисленных типов: со знаком и без знака. Целочисленные типы со знаком отличаются от аналогичных типов без знака способом интерпретации старшего разрядацелого числа. Так, если в программе указано целочисленное значение со знаком, токомпилятор C# сгенерирует код, в котором старший разряд целого числа используется в качестве флага знака. Число считается положительным, если флаг знака равен 0,и отрицательным, если он равен 1. Отрицательные числа практически всегда представляются методом дополнения до двух, в соответствии с которым все двоичные разрядыотрицательного числа сначала инвертируются, а затем к этому числу добавляется 1.
Целочисленные типы со знаком имеют большое значение для очень многих алгоритмов, но по абсолютной величине они наполовину меньше своих аналогов без знака.Вот как, например, выглядит число 32 767 типа short в двоичном представлении.0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Если установить старший разряд этого числа равным 1, чтобы получить значениесо знаком, то оно будет интерпретировано как -1, принимая во внимание формат дополнения до двух. Но если объявить его как значение типа ushort, то после установкив 1 старшего разряда оно станет равным 65 535.
Вероятно, самым распространенным в программировании целочисленным типомявляется тип int. Переменные типа int нередко используются для управления циклами, индексирования массивов и математических расчетов общего назначения. Когдаже требуется целочисленное значение с большим диапазоном представления чисел,чем у типа int, то для этой цели имеется целый ряд других целочисленных типов. Так,если значение нужно сохранить без знака, то для него можно выбрать тип uint, длябольших значений со знаком — тип long, а для больших значений без знака — типulong. В качестве примера ниже приведена программа, вычисляющая расстояние отЗемли до Солнца в дюймах. Для хранения столь большого значения в ней используется переменная типа long.// Вычислить расстояние от Земли до Солнца в дюймах.using System;class Inches { static void Main() { long inches; long miles; miles = 93000000; // 93 000 000 миль до Солнца // 5 280 футов в миле, 12 дюймов в футе, inches = miles * 5280 * 12; Console.WriteLine("Расстояние до Солнца: " + inches + " дюймов."); }}
Вот как выглядит результат выполнения этой программы.Расстояние до Солнца: 5892480000000 дюймов.
Очевидно, что этот результат нельзя было бы сохранить в переменной типа intили uint.
Самыми мелкими целочисленными типами являются byte и sbyte. Тип byteпредставляет целые значения без знака в пределах от 0 до 255. Переменные типа byteособенно удобны для обработки исходных двоичных данных, например байтового потока, поступающего от некоторого устройства. А для представления мелких целых значений со знаком служит тип sbyte. Ниже приведен пример программы, в которойпеременная типа byte используется для управления циклом, где суммируются числаот 1 до 100.// Использовать тип byte.using System;class Use_byte { static void Main() { byte x; int sum; sum = 0; for(x = 1; х <= 100; х++) sum = sum + х; Console.WriteLine("Сумма чисел от 1 до 100 равна " + sum); }}
Результат выполнения этой программы выглядит следующим образом.Сумма чисел от 1 до 100 равна 5050
В приведенном выше примере программы цикл выполняется только от 1 до 100,что не превышает диапазон представления чисел для типа byte, и поэтому для управления этим циклом не требуется переменная более крупного типа.
Если же требуется целое значение, большее, чем значение типа byte или sbyte,но меньшее, чем значение типа int или uint, то для него можно выбрать тип shortили ushort.Типы для представления чисел с плавающей точкой
Типы с плавающей точкой позволяют представлять числа с дробной частью. В С#имеются две разновидности типов данных с плавающей точкой: float и double. Онипредставляют числовые значения с одинарной и двойной точностью соответственно.Так, разрядность типа float составляет 32 бита, что приближенно соответствует диапазону представления чисел от 5Е-45 до 3,4Е+38. А разрядность типа double составляет64 бита, что приближенно соответствует диапазону представления чисел от 5Е-324 до1,7Е+308.