русс | укр

C# - Головна
Контакти
Задайте питання...
Перегляд всіх питань


Простір імен
  ► System (5)
  ► Microsoft (1)


Для учнів (початківців)
  ► Відео уроки (4)
  ► Навчання (177)
  ► Приклади програм (19)
  ► Секрети Сі Шарп (4)

Для професіоналів
  ► Навчання (6)
  ► Приклади програм (1)










Приведення типів

Необхідність у перетворенні типів виникає у виразах, присваиваниях, заміні формальних аргументів методу фактичними. Якщо при обчисленні виразу операнди операції мають різні типи, то виникає необхідність приведення їх до одного типу. Така необхідність виникає і тоді, коли операнди мають один тип, але він неузгодженим з типом операції. Наприклад, при виконанні додавання операнди типу byte повинні бути приведені до типу int, оскільки складання не визначено над байтами. При виконанні присвоювання x=e тип джерела e і тип мети x повинні бути узгоджені. Аналогічно, при виклику методу також повинні бути узгоджені типи джерела та цілі - фактичної і формальної аргументів.

В C# перетворення поділяються на неявні та явні. До неявним відносяться ті перетворення, результат виконання яких завжди успішний і не призводить до втрати точності даних. Неявні перетворення виконуються автоматично. Для арифметичних даних це означає, що в неявних перетвореннях діапазон типу призначення містить у собі діапазон вихідного типу. Наприклад, перетворення з типу byte в тип int відноситься до неявним, оскільки діапазон типу byte є підмножиною діапазону int. Це перетворення завжди успішно і не може призводити до втрати точності. Зауважте, перетворення з цілочисельних типів до типів з плаваючою точкою відносяться до неявним. Хоча тут і може відбуватися деяке спотворення значення, але точність подання значення зберігається, наприклад, при перетворенні з long в double порядок значення залишається незмінним.

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

Важливим класом перетворень є перетворення в рядковий тип і навпаки. Перетворення в рядковий тип завжди визначені, оскільки всі типи є нащадками базового класу Object, а, отже, мають методом ToString(). Для вбудованих типів визначена відповідна реалізація цього методу. Зокрема, для всіх підтипів арифметичного типу метод ToString() повертає у відповідній формі рядок, що задає значення відповідного арифметичного типу. Зауважте, метод ToString можна викликати явно, але, якщо явний виклик не вказаний, то він буде викликатися неявно, всякий раз, коли з контексту потрібно перетворення на строковому типу. От відповідний приклад:

 

/// < summary>

/// Демонстрація перетворення в рядок даних різного типу.

/// < /summary>

public void ToStringTest()

{

s ="Володимир Петров ";

s1 =" Вік: "; ux = 27;

s = s + s1 + ux.ToString();

s1 =" Зарплата: "; dy = 2700.50;

s = s + s1 + dy;

WhoIsWho("s",s);

}

 

Тут для змінної ux метод був викликаний явно, а для змінної dy він викликається автоматично.

Перетворення строкового типу в інші типи, наприклад, в арифметичний, повинні виконуватися явно. Але явних перетворень між арифметикою і рядками не існують. Необхідні інші механізми, і вони в C# є. Для цієї мети можна використовувати відповідні методи класу Convert бібліотеки FCL, вбудованого в простір імен System. Розглянемо відповідний приклад:

 

/// < summary>

/// Демонстрація перетворення рядка в дані різного типу.

/// < /summary>

public void FromStringTest()

{

s =", Введіть вік ";

Console.WriteLine(s);

s1 = Console.ReadLine();

ux = Convert.ToUInt32(s1);

WhoIsWho("Вік: ",ux);

s ="Введіть зарплату ";

Console.WriteLine(s);

s1 = Console.ReadLine();

dy = Convert.ToDouble(s1);

WhoIsWho("Зарплата: ",dy);

}

 

Цей приклад демонструє ввести з консолі даних різних типів. Дані читаються з консолі методом ReadLine або Read, завжди являють собою рядок, яку потім необхідно перетворити в потрібний тип. Тут-то і викликаються відповідні методи класу Convert.

Клас Convert, визначений у просторі імен System, відіграє важливу роль, забезпечуючи необхідні перетворення між різними типами. Нагадаю, що всередині арифметичного типу можна використовувати більш простий, скобочный спосіб приведення до потрібного типу. Але таким способом можна привести, наприклад, змінну типу string до типу int, оператор присвоювання: ux = (int)s1; призведе до помилки періоду компіляції. Тут необхідний виклик методу ToInt32 класу Convert, як це зроблено в останньому прикладі попереднього розділу.

Методи класу Convert підтримують загальний спосіб виконання перетворень між типами. Клас Convert містить 15 статичних методів виду To <Type> (ToBoolean(),...ToUInt64()), де Type може приймати значення від Boolean до UInt64 для всіх вбудованих типів. Єдиним винятком є тип object, - методу ToObject немає за зрозумілих причин, оскільки для всіх типів існує неявне перетворення до типу object.

Всі методи To <Type> класу Convert перевантажені і кожен з них має, як правило, більше десятка реалізацій з аргументами різного типу. Так що фактично ці методи задають всі можливі перетворення між усіма вбудованими типами мови C#.Крім методів, які задають перетворення типів, в класі Convert є й інші методи, наприклад, задають перетворення символів Unicode в однобайтную кодування ASCII, перетворення значень об'єктів та інші методи. Подробиці можна подивитися в довідковій системі.

 

Переглядів: 1812






© 2012 ci-sharp.ru При використанні матеріалу пряме iндексуюче посилання на сайт ОБОВ'ЯЗКОВЕ.
Права строго захищені нормами міжнародного права, інтелектуальної власності та авторського права.