Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие КНЕУ.doc
Скачиваний:
24
Добавлен:
07.03.2016
Размер:
3.9 Mб
Скачать

2.2.2. Типи літералів

Літерали (константи) теж мають тип. Якщо значення цілого літерала знаходяться усередині діапазону допустимих значень типу іnt, літерал розглядається як int, інакше він відноситься до найменшого з типів uint, long або ulong, в діапазон значень якого він входить. Дійсні літерали за умовчанням відносяться до типу double.

Наприклад, константа 10 відноситься до типу int (хоча для її зберігання достатньо одного байта), а константа 2147483648 буде визначена як uint. Для явного завдання типу літерала служить суфікс, наприклад, 1.1f, 1UL, 1000m (суфікси показані в таблиці. 2.3). Явне завдання застосовується в основному для зменшення кількості неявних перетворень типу, що виконуються компілятором.

2.2.3. Типи-значення і посилальні типи

Найчастіше типи С# розділяють за способом зберігання елементів на типи-значення і посилальні типи (рис. 2.2). Елементи типів-значень, або значущих типів (value types), є просто послідовністю бітів в пам'яті, необхідний об'єм якої виділяє компілятор. Іншими словами, величини значущих типів зберігають свої значення безпосередньо. Величина посилального типу зберігає не самі дані, а посилання на них (адреса, по якій розташовані дані). Самі дані зберігаються в хіпові. Не дивлячись на відмінності в способі зберігання, і типи-значення, і посилальні типи є нащадками загального базового класу object.

Рисунок 2.3 ілюструє різницю між величинами значущого і посилального типів. Одні і ті ж дії над ними виконуються по-різному. Розглянемо як приклад перевірку на рівність. Величини значущого типу рівні, якщо рівні їх значення. Величини посилального типу рівні, якщо вони посилаються на одні і ті ж дані (на рисунку b і с рівні, але а не рівне b навіть при однакових значеннях). З цього виходить, що якщо змінити значення однієї величини посилального типу, це може відбитися на іншій.

Рис. 2.2. Класифікація типів даних C# за способом зберігання

Рис. 2.3. Зберігання в пам'яті величин значущого і посилального типів

Всі значущі типи є простими. По іншій класифікації структури і перелічення відносяться до структурованих типів, що визначаються програмістом. Деталізація типів даних, приведених на рис. 2.2 буде розглянута в подальших розділах.

2.2.4. Упаковка і розпаковування

Для того, щоб величини посилального і значущого типів могли використовуватися спільно, необхідно мати можливість перетворення з одного типу в інший. Мова С# забезпечує таку можливість. Перетворення з типу-значення в посилальний тип називається упаковкою (boxing), зворотне перетворення - розпаковуванням (unboxing).

Якщо величина значущого типу використовується в тому місці, де потрібний посилальний тип, автоматично виконується створення проміжної величини посилального типу: створюється посилання, в хіпові виділяється відповідний об'єм пам'яті і туди копіюється значення величини, тобто значення ніби упаковується в об'єкт. При необхідності зворотного перетворення з величини посилального типу «знімається упаковка», і в подальших діях бере участь тільки її значення.