Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб роб 0.doc
Скачиваний:
1
Добавлен:
14.11.2019
Размер:
169.98 Кб
Скачать

ItemDetaiis id;

id.Description = "Що-небудь";

id.ApproxPrice = (int)(Prices[0]+ 0.5);

Використовуючи явне приведення типу, можна перетворити будь-який екземпляр простого типу за значенням в будь-який інший тип. Проте існують обмеження на те, що можна робити за допомогою явного перетворення типів – типи за значенням допускають перетворення тільки в/з типів char, числових типів і типів enum. Не можна безпосередньо приводити тип Boolean до будь-якого іншого типу і навпаки.

Якщо потрібно виконати перетворення, наприклад, між числовим типом і рядком, то бібліотека класів .NET пропонує відповідні методи. Клас object має метод ToString(), який повинні реалізовувати всі класи. Цей метод повертає рядкове представлення об'єкту, так що рядкове представлення int можна отримати за допомогою коду:

int i = 10;

string s = i.ToString();

Аналогічно, якщо потрібно обробити рядок і отримати з нього числове значення або значення типу Boolean, можна використовувати метод Parse, підтримуваний всіма стандартними типами за значенням:

string s = "100";

int I = int.Parse(s);

Console.WriteLine(I+50); // Додаємо 50, щоб показати, що це дійсно int

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

Всі типи, як прості стандартні, наприклад int і char, так і складні, наприклад класи і структури, є похідними від типу object. Це означає, що навіть з числовими значеннями можна поводитися так, як ніби це об'єкти:

string s=10.ToString();

Типи даних С# діляться на типи за значенням, які містять набір даних і розміщуються в стеку, і на посилальні типи, які не мають заздалегідь визначеного розміру і розташовуються в купі. Як це поєднується із здатністю викликати методи для int, якщо int є всього лише чотирьохбайтовою величиною в стеку?

Спосіб, за допомогою якого С# досягає цього, полягає у використанні способу, званого упаковкою (boxing). Упаковка і розпаковування дозволяють перетворювати типи за значенням в типи по посиланню і навпаки. Ми говоримо про це в розділі, присвяченому приведенню типів, оскільки при упаковці ми приводимо нашу величину до типу object. Упаковка – це термін, використовуваний для опису перетворення типу за значенням в тип по посиланню. По суті середовище виконання створює тимчасову комірку посилального типу для об'єкту в купі.

Це перетворення може здійснюватися неявно, як в прикладі вище, але його можна виконати і уручну:

int I = 20;

object о = I;

Розпаковування — це термін, використовуваний для опису зворотного процесу, коли значення типу по посиланню перетвориться в тип за значенням. В даному випадку перетворення повинне бути зроблене явно. Синтаксис схожий на синтаксис явного перетворення типів:

int I = 20;

object о = I; // Упакуємо int

int j = (int)о; // Розпакуємо назад в int

Розпакувати можна тільки змінну, яка була перед цим запакована.

Єдине попередження: змінна, в яку проводиться розпаковування, повинна мати достатній об'єм для розміщення в ній всіх байтів розпаковуваної змінної. Наприклад, в С# змінні типу int є 32-розрядними, тому розпаковування значення long (64 біти) в int приведе до помилки. Розглянемо код:

long а = 333333423; // а є локальній змінній типу long, що зберігається в стеку.

object b = (object)а; // b є посиланням на копію а, упаковану в купі.

int с = (int)b; // Помилка: змінна типу long розпаковується в змінну типу int.

В даному випадку 64-розрядна величина long упаковується в купу, а потім розпаковується в 32-розрядний int. Змінна c не має достатньо місця для зберігання величини такого розміру. Спроба розпакувати величину з купи в невідповідну для цього змінну за значенням приведе до виникнення помилки часу виконання. Коли ви упаковуєте змінну за значенням, вашою турботою як програміста є запам'ятовування первинного типу змінної; спроби розпакувати її в інші типи, швидше за все, приведуть до помилки.