- •Лекція 3. Ядро мови c#
- •3.1. Основні поняття c#
- •Ідентифікатори
- •Ключові слова
- •Знаки операцій і роздільники
- •Літерали (константи)
- •Коментарі
- •3.2. Система типів c#
- •Вбудовані типи
- •3.3. Змінні, операції, вирази
- •3.3.1. Визначення простих типів і їх ініціалізація
- •3.3.2. Операції і вирази
- •3.4. Перетворення вбудованих арифметичних типів-значень
- •3.5. Перетворення з рядкового типу в арифметичний
- •3.5.1. Метод Parse
- •3.5.2. Перетворення з арифметичного типу у тип string
- •3.5.3. Клас Convert і його методи
- •3.6. Стиль програмування. Узгодження іменування
- •Питання і завдання для самостійної роботи студента
- •Лабораторна робота № 2
3.4. Перетворення вбудованих арифметичних типів-значень
При обчисленні виразів може виникнути необхідність в перетворенні типів. Якщо операнди, що входять у вираз, одного типу, і операція для цього типа визначена, то результат виразу матиме той самий тип.
Якщо операнди різного типу і (або) операція для цього типу не визначена, перед обчисленнями автоматично виконується перетворення типу по правилах, що забезпечують приведення коротших типів до довших для збереження значущості і точності. Автоматичне (неявне) перетворення можливе не завжди, а лише якщо при цьому не може статися втрата значущості.
Якщо неявного перетворення з одного типа в іншій не існує, програміст може задати явне перетворення типу за допомогою операції (тип) x.
Розрізняються:
Розширююче перетворення – значення одного типу приводиться до значення іншого типу, яке має такий самий або більший розмір. Наприклад, значення, представлене у вигляді 32-розрядного цілого числа із знаком, може бути перетворено в 64-розрядне ціле число із знаком. Таке перетворення вважається безпечним, оскільки початкова інформація при такому перетворенні не спотворюється.
Можливі варіанти перетворення типів
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 |
Всі арифметичні класи, у тому числі клас Int, мають перегружений статичний метод Parse, в якого першим обов'язковим параметром є рядок, що задає значення відповідного арифметичного типу в локалізованій формі. Форматом рядка і стилем її представлення можна управляти за допомогою інших параметрів методу Parse.
Ось приклад виклику цього методу для класів Int і Double.
Приклад 3.1.
// Перетворення типу з використанням методу Parse
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Parsing
{
class Program
{
static void Main(string[] args)
{
//method Parse
Console.WriteLine("Введіть ціле");
string strdata = Console.ReadLine();
int intdata = int.Parse(strdata);
Console.WriteLine("Введіть число з дробовою частиною і порядком");
strdata = Console.ReadLine();
double doubdata = double.Parse(strdata);
Console.WriteLine("intdata = {0}; doubdata = {1}",
intdata, doubdata);
Console.ReadKey();
}
}
}
Звужуюче перетворення - значення одного типу перетвориться до значення іншого типу, яке має менший розмір (з 64-розрядного в 32-розрядне).
Таке перетворення потенційно небезпечно втратою значення.
Звужуючі перетворення можуть приводити до втрати інформації. Якщо тип, до якого здійснюється перетворення, не може правильно передати значення джерела, то результат перетворення виявляється рівний константі
PositiveInfinity або NegativeInfinity.
При цьому значення PositiveInfinity інтерпретується як результат ділення позитивного числа на нуль, а значення NegativeInfinity інтерпретується як результат ділення негативного числа на нуль.
Якщо звужуюче перетворення забезпечується методами класу System.Convert то втрата інформації супроводиться генерацією виключної ситуації.
Явне і неявне перетворення типів
Приклади явного і неявного перетворення типів
int x = 25;
long y = x; // неявне
short z = (short)x; // явне
double d = 3.141592536;
float f = (float)d; // явне
long l = (long)d; // явне
Система Common Type System середовища Microsoft .NET забезпечує безпечну типізацію, тобто гарантує відсутність побічних ефектів (переповнення оперативної пам'яті комп'ютера, некоректне перетворення типів і т.д.).
