У мові C# є такі примітивні типи даних:
Клас містить:
Об’єкти — екземпляри класу, є узагальненням поняття змінної.
На початковому етапі можна вважати, що:
Поняття клас і тип — синоніми, змінна і об’єкт — також синоніми.
Вбудовані типи, такі як int або string, і надалі називають типами, а їх екземпляри — змінними.
Для абстрактних даних, які описують, наприклад, клас ссавців, замість типу говорять клас, а замість змінної — об’єкт.
Такий погляд на типи й класи досить корисний, але не повний.
| Категорія | Підкатегорія | Типи даних | Опис |
|---|---|---|---|
| Прості (вбудовані) | Цілочисельні | byte, sbyte, short, ushort, int, uint, long, ulong |
Використовуються для зберігання цілих чисел. |
| Дійсні (з плаваючою комою) | float, double, decimal |
Використовуються для зберігання дійсних чисел. | |
| Логічні | bool |
Містить два можливих значення: true або false. |
|
| Символьні | char |
Зберігає один символ у форматі Unicode. | |
| Текстові | string |
Послідовність символів (рядок). | |
| Структуровані | Масиви | int[], double[], string[] |
Набір елементів одного типу, до яких звертаються за індексом. |
| Структури | struct |
Користувацькі типи, що містять поля різних типів. | |
| Переліки | enum |
Перелік іменованих констант. | |
| Визначені програмістом | Класи | class |
Описують об’єкти, що мають поля, властивості, методи, події. |
| Інтерфейси | interface |
Визначають набір методів без реалізації. | |
| Делегати | delegate |
Посилання на метод або групу методів. | |
| Записи | record |
Не змінювані типи даних, зручні для зберігання об’єктів із властивостями. | |
| За способом зберігання | Значимі | int, double, bool, struct, enum |
Зберігаються безпосередньо у стеку, містять власні дані. |
| Посилальні | string, class, array, delegate, record |
Зберігають посилання на об’єкт, який знаходиться у керованій купі (heap). |
Для значимих типів використовується пряма адресація — значення зберігає власне дані, і пам’ять для них виділяється в стеку.
Стек — це область пам’яті, яку підтримує процесор. Доступ до стеку у багато разів швидший, ніж до загальної області пам’яті.
Для посилальних типів значенням є посилання на певний об’єкт, розташований у динамічній пам’яті — “купі”. Кілька посилальних змінних можуть вказувати на один і той самий об’єкт і використовувати його значення.
У мові C# чітко визначено, які типи належать до посилальних, а які — до значимих.
До значимих типів належать: логічний, арифметичні, структури, перелік.
До посилальних типів належать: масиви, рядки та класи.
Усі вбудовані типи C# однозначно відображаються, а фактично збігаються із системними типами каркасу .NET Framework, розміщеними в просторі імен System. Тому всюди, де можна використовувати ім’я типу, наприклад int, із тим же успіхом можна використовувати й ім’я Int32.
| Назва | Ім’я типу C# | Тип у Framework | Діапазон значень | Кількість бітів |
|---|---|---|---|---|
| Логічний | bool | Boolean | true, false | 8 |
| Цілі | sbyte | SByte | –128 — 127 | 8 |
| byte | Byte | 0 — 255 | 8 | |
| int | Int32 | –2*109 — 2*109 | 32 | |
| long | Int64 | –9*1018 — 9*1018 | 64 | |
| Дійсні | float | Single | 1.5*10-45 — 3.4*1038 | 32 |
| double | Double | 5.0*10-324 — 1.7*10308 | 64 | |
| Символьні типи | char | Char | U+0000 — U+ffff | 16 |
| string | String | рядок із символів Unicode | - |
Приклади:
|
Усі змінні в програмі обов’язково повинні бути ініціалізовані (мати початкове значення)!!!
Змінні існують лише у своїй області видимості, після виходу з якої “помирають”.
Область видимості змінної починається з рядка, де змінна оголошена, і закінчується закриваючою фігурною дужкою (змінну слід оголосити між цією дужкою та парною до неї відкриваючою).
Ось пояснювальний приклад:
|
Тут значення змінної k доступне і буде виведене на екран.
|
У цьому ж прикладі вивести k на екран не вдасться — вона “померла” на закриваючій фігурній дужці.
Ось кілька прикладів опису іменованих констант:
|
Під час введення дійсних констант у програмі можна використовувати спеціальні суфікси в кінці:
|
Під час присвоєння значень слід мати на увазі таку особливість: усі дійсні літерали розглядаються як значення типу double. Щоб вказати, що дробове число належить типу float або decimal, потрібно додавати до літералу суфікс: F/f — для float і M/m — для decimal.
Подібним чином усі цілочисельні літерали розглядаються як значення типу int. Щоб явно вказати, що цілочисельний літерал має тип uint, слід використовувати суфікс U/u, для типу long — суфікс L/l, а для типу ulong — суфікс UL/ul: