- •Тема 4. Типи даних та змінні.
- •1. Система типів .Net. Вбудовані типи даних у cts.
- •2. Оголошення та ініціалізація змінних. Константи. Область видимості та час існування змінної.
- •3. Операції та вирази
- •4. Літерали.
- •5. Приведення типів даних.
- •6. Поняття стеку і кучі. Значимі та посилальні типи даних у .Net і с#.
- •26: Struct Point
5. Приведення типів даних.
Приведення типів - один з аспектів безпеки мови.
Використовувані в програмі типи характеризуються власними діапазонами значень, які визначаються властивостями типів, - у тому числі і розміром області пам'яті, призначеної для кодування значень відповідного типу. При цьому області значень різних типів перетинаються. Багато значень можна виразити більш ніж одним типом. Наприклад, значення 4 можна представити як значення типа sbyte, byte, short, ushort, int, uint, long, ulong. При цьому в програмі все повинно бути влаштовано так, щоб логіка перетворення значень одного типу до іншого типу була зрозумілою, а результати цих перетворень - передбачувані.
Інколи приведення значення до іншого типа відбувається автоматично. Такі перетворення називаються неявними.
Але у ряді випадків перетворення вимагає додаткової уваги з боку програміста, який повинен явним чином вказувати необхідність перетворення, використовуючи вирази приведення типа або звертаючись до спеціальних методів перетворення, визначеним в класі System.Convert, які забезпечують перетворення значення одного типа до значення іншого.
Перетворення типу створює значення нового типу, еквівалентне значенню старого типа, проте при цьому не обов'язково зберігається ідентичність (або точні значення) двох об'єктів.
Розрізняють розширене та звужуюче перетворення:
Розширене перетворення - значення одного типу перетвориться до значення іншого типу, яке має такий же або більший розмір. Наприклад, значення, представлене у вигляді 32-розрядного цілого числа із знаком, може бути перетворене в 64-розрядне ціле число із знаком. Розширене перетворення вважається безпечним, оскільки вихідна інформація при такому перетворенні не спотворюється.
Можливість розширеного перетворення представлено у таблиці нижче.
Таблиця 7
Можливість розширеного перетворення типів даних
Тип, що перетворюється |
У який тип перетворюється |
Byte |
UInt16, Int16, UInt32, Int32, UInt64, Int64, Single, Double, Decimal |
SByte |
Int16, Int32, Int64, Single, Double, Decimal |
Int16 |
Int32, Int64, Single, Double, Decimal |
UInt16 |
UInt32, Int32, UInt64, Int64, Single, Double, Decimal |
Char |
UInt16, UInt32, Int32, UInt64, Int64, Single, Double, Decimal |
Int32 |
Int64, Double, Decimal |
UInt32 |
Int64, Double, Decimal |
Int64 |
Decimal |
UInt64 |
Decimal |
Single |
Double |
Звужуюче перетворення - значення одного типу перетвориться до значення іншого типа, яке має менший розмір (з 64-розрядного в 32-розрядне). Таке перетворення потенційне небезпечно втратою значення. Звужуючі перетворення можуть призводити до втрати інформації. Якщо тип, до якого здійснюється перетворення, не може правильно передати значення джерела, то результат перетворення виявляється дорівнює константі PositiveInfinity або NegativeInfinity.При цьому значення PositiveInfinity інтерпретується як результат ділення додатнього числа на нуль, а значення NegativeInfinity - як результат ділення відємного числа на нуль. Якщо звужуюче перетворення забезпечується методами класу System.Convert, то втрата інформації супроводиться генерацією виключення (про виключення пізніше).
Таблиця 8
Можливість звужуючого перетворення типів даних
Тип, що перетворюється |
У який тип перетворюється |
Byte |
Sbyte |
SByte |
Byte, UInt16, UInt32, UInt64 |
Int16 |
Byte, SByte, UInt16 |
UInt16 |
Byte, SByte, Int16 |
Int32 |
Byte, SByte, Int16, UInt16, UInt32 |
UInt32 |
Byte, SByte, Int16, UInt16, Int32 |
Int64 |
Byte, SByte, Int16, UInt16, Int32, UInt32, UInt64 |
UInt64 |
Byte, SByte, Int16, UInt16, Int32, UInt32, Int64 |
Decimal |
Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64 |
Single |
Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64 |
Double |
Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt6 |
Приклад 10. Звужуюче перетворення.
1: public static void Main()
2: {
3: int i = 1234567;
4: short s = (short)i;
5: Console.WriteLine("int - {0}\n short - {1}", i,s);
6: }
Рис. 2. Результат виконання прикладу 10.