Перш ніж перейти до вивчення конкретних типів мови С#, розглянемо їх класифікацію. Всі типи можна розділити на прості (не мають внутрішньої структури) і структуровані (складаються з елементів інших типів). Типи можна розділити на вбудовані (стандартні) і визначених програмістом (рис. 2.1). Для даних статичного типу пам'ять виділяється у момент оголошення, при цьому її необхідний об'єм відомий. Для даних динамічного типу розмір даних у момент оголошення може бути невідомий, і пам'ять під них виділяється за запитом в процесі виконання програми.
Вбудовані типи не вимагають попереднього визначення. Для кожного типу існує ключове слово, яке використовується при описі змінних, констант і т.д. Якщо ж програміст визначає власний тип даних, він описує його характеристики і сам дає йому ім'я, яке потім застосовується точно так, як і імена стандартних типів. Опис власного типу даних повинен включати всю інформацію, необхідну для його використання, а саме внутрішнє уявлення і допустимі дії.
Рис. 2.1. Різні класифікації типів даних С#
Вбудовані типи С# приведені в таблиці. 2.5. Вони однозначно відповідають стандартним класам бібліотеки .NET, визначеним в просторі імен System. Як видно з таблиці, існують декілька варіантів представлення цілих і дійсних величин. Програміст вибирає тип кожної величини, яка використовується в програмі, з урахуванням необхідного йому діапазону і точності представлення даних.
Цілі типи, а також символьний, дійсний і фінансовий типи можна об'єднати під назвою арифметичних типів.
Внутрішнє представлення величини цілого типу - ціле число в двійковому коді. У знакових типах старший біт числа інтерпретується як знаковий (0 додатне число, 1 – від’ємне). Від’ємні числа найчастіше представляються в так званому додатковому коді. Для перетворення числа в додатковий код всі розряди числа, за винятком знакового інвертуються, потім до числа додається одиниця, і знаковому біту теж привласнюється одиниця. Беззнакові типи дозволяють представляти тільки додатні числа, оскільки старший розряд розглядається як частина коду числа.
Для дійсних і фінансового типів в таблиці приведені абсолютні величини мінімальних і максимальних значень. Дійсні типи, або типи даних, з плаваючою крапкою зберігаються в пам'яті комп'ютера інакше, ніж цілочисельні. Внутрішнє представлення дійсного числа складається з двох частин - мантиси і порядку, кожна частина має знак. Довжина мантиси визначає точність числа, а довжина порядку - його діапазон. У першому наближенні це можна уявити собі так: наприклад, для числа 0,381•104 зберігаються цифри мантиси 381 і порядок 4, для числа 560,3•102 - мантиса 5603 і порядок 5 (мантиса нормалізується), а число 0,012 представлено як 12 і -1. Звичайно, в даному прикладі не враховані система числення і інші особливості. Всі дійсні типи можуть бути представлені як додатні, так і від’ємні числа.
Таблиця 2.5.
Вбудовані типи С#
Ключове слово
| Тип .NET
| Діапазон значень
| Опис
| Розмір, бітів
|
bоо1
| Boolean
| true, false
|
sbyte
| SByte
| От-128 до 127
| Із знаком
|
|
byte
| Byte
| От 0 до 255
| Без знаку
|
|
short
| Intl6
| От –З2768 до З2767
| Із знаком
|
|
ushort
| UIntl6
| От 0 до 655З5
| Без знаку
|
|
int
| Int32
| От -231 до 231 – 1
| Із знаком
|
|
uint
| UInt32
| От 0 до 232 – 1
| Без знаку
|
|
long
| Int64
| От -263 до 263 – 1
| Із знаком
|
|
ulong
| UInt64
| От 0 до 264 – 1
| Без знаку
|
|
char
| Char
| От U+0000 до U+ffff
| Unicode-символ
|
|
float
| Single
| От 1.5•10-45 до 3.4•1038
| 7 цифр
|
|
double
| Double
| От 5.0•10-324 до 1.7•10308
| 15-16 цифр
|
|
decimal
| Decimal
| От 1.0•10-28 до 7.9•1028
| 28-29 цифр
|
|
string
| String
| Довжина обмежена об'ємом доступної пам'яті
| Рядок з Unicode- символів
|
object
| Object
| Можна зберігати все що завгодно
| Загальний предок
|
Найчастіше в програмах використовується тип double, оскільки його діапазон і точність задовольняють більшість потреб. Цей тип мають дійсні літерали і багато стандартних математичних функцій. При однаковій кількості байтів, що відводяться під величини типу float і int, діапазони їх допустимих значень сильно розрізняються із-за внутрішньої форми уявлення.
Те ж саме відноситься до long і double. Тип decimal призначений для грошових обчислень, в яких критичні помилки округлення. Як видно з таблиці 2.5, тип float дозволяє зберігати одночасно всього 7 значущих десяткових цифр, тип double - 15-16. При обчисленнях помилки округлення накопичуються, і при певному поєднанні значень навіть може привести до результату, в якому не буде жодної вірної значущої цифри! Величини типу decimal дозволяють зберігати 28-29 десяткових розрядів.
Тип decimal не відноситься до дійсних типів, у них різне внутрішнє уявлення. Величини грошового типу навіть не можна використовувати в одному виразі з дійсними без явного перетворення типу. Використання величин фінансового типу в одному виразі з цілими допускається.
Будь-який вбудований тип С# відповідає стандартному класу бібліотеки .NET, визначеному в просторі імен System. Скрізь, де використовується ім'я вбудованого типу, його можна замінити ім'ям класу бібліотеки. Це означає, що у вбудованих типів даних С# є методи і поля. З їх допомогою можна, наприклад, набути мінімальних і максимальних значень для цілих, символьних, фінансових і дійсних чисел:
§ double.MaxValue (или System.Doublе.MaxValue) - максимальне число типу double;
§ uint.MinValue (или System.UInt32.MinValue)- мінімальне число типа uint.