Существует бесконечное множество типов, которые можно использовать, так как имеется возможность описывать
свои собственные типы, предназначенные для хранения любых даже самых сложных данных.
Однако существуют определенные типы данных, которые раньше или позже потребуются всем, например, переменные, в которых могут храниться числа. По этой причине существует некоторое количество простых, предварительно описанных типов данных.
1.2.1.Простые типы переменных
Простые типы – это такие типы значений, как численные или логические (true (истина) или false (ложь)), которые являются составными частями любых приложений, а также других, более сложных типов. Большинство из имеющихся типов являются численными, что на первый взгляд выглядит несколько странно: разве для хранения чисел не достаточно одного типа?
Причина такого изобилия численных типов кроется в способе хранения чисел в памяти компьютера как последовательности нулей и единиц. В случае целых значений мы используем несколько бит (отдельных цифр, которые могут принимать значение нуля или единицы) и просто представляем число в двоичном формате. Переменная, в которой может храниться N бит, позволяет представлять любые числа в диапазоне от 0 до ( N 12 - ). Числа, превышающие последнее значение, оказываются слишком большими и не могут быть размещены в переменной данного типа.
В качестве примера рассмотрим переменную, в которой может храниться 2 бита. Соответствие между целыми числами и их двоичным представлением в этом случае будет следующим:
0 = 00 1 = 01 2 = 10 3 = 11
Если необходимо хранить большие числа, то для этого потребуется большее количество бит (3 бита, например, позволят хранить числа, лежащие в диапазоне от 0 до 7).
Отсюда неизбежно следует вывод о том, что хранение произвольного числа требует бесконечного количества бит, что, безусловно, неприемлемо для персонального компьютера. Но даже если бы необходимое количество бит и имелось, использовать такой объем памяти для числа, изменяющегося, скажем, от 0 до 10, было бы крайне неэффективно (из-за неиспользуемой памяти). В данном случае вполне достаточно 4 бит, которые позволяют разместить в одной и той же области памяти все числа указанного диапазона.
Именно для этого существует несколько целых типов, которые могут быть использованы для хранения чисел из различных диапазонов и которые занимают различный объем памяти (вплоть до 64 битов). Эти типы целых чисел сведены в таблицу, приводимую ниже.
Каждый тип использует один из стандартных типов, определенных в .NET Framework. Применение стандартных типов – это как раз то, что делает возможным совместное использование различных языков программирования. Имена, которые используются для этих типов в С#, обозначают определенные типы, описанные в .NET Framework. В таблице 1.1 приводятся имена типов и указывается, какому типу в библиотеке .NET Framework они соответствуют.
Буква "u", встречающаяся перед некоторыми из имен, является сокращением от слова "unsigned" ("беззнаковый"). Это говорит о том, что в переменных соответствующего типа не могут храниться отрицательные значения. Этот факт отражен в столбце "Допустимые значения".
Таблица 1.1 – Типы данных C# и соответствующие им типы .NET Framework
Тип | Тип .NET Framework | Допустимые значения |
sbyte | System. Byte | Целое в диапазоне от -128 до 127 |
byte | System. Byte | Целое в диапазоне от 0 до 255 |
short | System.Intl6 | Целое в диапазоне от -32 768 до 32 767 |
ushort | System.UIntl6 | Целое в диапазоне от 0 до 65 535 |
int | System.Int32 | Целое в диапазоне от -231 до 231 -1 |
uint | System.UInt32 | Целое в диапазоне от 0 до 232 -1 |
long | System.Int64 | Целое в диапазоне от -263 до 263 -1 |
ulong | System.UInt64 | Целое в диапазоне от 0 до 264 -1 |
Кроме целых чисел часто требуется хранить дробные значения (или значения с плавающей запятой), которые представляют нецелые числа. Существует три типа переменных с плавающей запятой, которые можно использовать: float, double и decimal. Первые два из них хранят числа с плавающей запятой в виде ± m 2× e , причем диапазон допустимых значений m и е для каждого типа свой. Тип decimal использует альтернативную форму представления чисел ± m 10× e . Эти три типа приводятся ниже вместе с допустимыми значениями m и е и диапазонами действительных чисел
(таб. 1.2).
Таблица 1.2 – Дробные типы данных C# и соответствующие им типы .NET Framework
float | System.Single | 0 | 224 | -149 | 104 | 1.5 10× -45 | 3.4 10× 38 |
double | System.Double | 0 | 253 | -1075 | 970 | 5 10× -324 | 1.7 10× 307 |
decimal | System.Decimal | 0 | 296 | -26 | 0 | 1 10× -28 | 7.9 10× 28 |
Кроме численных типов, существует еще три простых типа (таб. 1.3).
Таблица 1.3 – Символьные и логические типы данных C# и соответствующие им типы данных .NET Framework
Тип | Тип .NET Framework | Диапазон допустимых значений |
char | System.Char | Отдельный символ в кодировке Unicode, хранящийся в виде целого числа в диапазоне от 0 до 65 535 |
bool | System.Boolean | Логическое значение (Boolean), которое может принимать значения true (истина) илиfalse(ложь) |
string | System.String | Последовательность символов |
Следует обратить внимание, что верхней границы количества символов, составляющих строки типа string, не существует, поскольку они могут занимать изменяющиеся объемы памяти.
Логический тип bool – один из наиболее часто используемых в С# типов переменной; аналогичные типы часто встречаются в кодах на других языках программирования. Использование переменной, которая может принимать только два значения – либо true, либо false,– создает очень важную возможность ветвления логики приложения. Одним из применений такого типа данных - сравнение значений переменных и проверка допустимости введенной информации.
1.2.2.Именование переменных
Нельзя использовать в качестве имени переменной произвольную последовательность символов. Однако в распоряжении разработчика имеется весьма гибкая система именования.
Основные правила при именовании переменных следующие:
- первый символ в имени переменной должен быть либо буквой, либо символом подчеркивания _, либо @; - последующими символами могут быть буквы, символ подчеркивания или цифры.
Кроме того, существуют определенные ключевые слова, которые обладают особым смыслом с точки зрения компилятора С#, например, using или namespace.
Если по ошибке используется одно из них, компилятор сгенерирует соответствующую ошибку при компиляции. Следующие имена переменных являются правильными: myBigVar
VAR1
_test
А вот эти – нет: 99BottlesOfBeer namespaceIt's-All-Over
С# чувствителен к регистру: необходимо постоянно помнить о правильном использовании регистров в соответствии с тем, как они использовались при объявлении переменных. Обращение к переменной внутри программы, в котором хотя бы один символ будет набран в неверном регистре, приведет к выдаче сообщения об ошибке в процессе компиляции.
Другим следствием этой ситуации является возможность иметь множество имен переменных, которые будут отличаться друг от друга только использованием регистра; например, приведенные ниже имена различны:
myVariable MyVariable MYVARIABLE
1.2.3.Соглашения, используемые при именовании
Имена переменных – это нечто такое, что приходится использовать очень часто. Поэтому стоит посвятить немного времени тому, какие типы имен следует применять. Однако прежде чем перейти к обсуждению этого вопроса, следует отметить, что данная тема полна противоречий. На протяжении многих лет одни системы именования сменялись другими, а некоторые разработчики готовы насмерть стоять за признание только собственных систем.