Вправа – огляд лишання та перетворення типів даних
- 30 хвилин
Перетворення типу даних можна виконати кількома способами. Вибраний метод залежить від вашої відповіді на два важливі запитання:
- Чи можна, залежно від значення, що спроба змінити тип даних значення призведе до винятку під час виконання?
- Чи можна, залежно від значення, що спроба змінити тип даних значення призведе до втрати інформації?
У цій вправі ви проходите через ці запитання, наслідки їхніх відповідей і те, який метод слід використовувати, коли потрібно змінити тип даних.
Підготовка середовища кодування
Цей модуль містить практичні дії, які допоможуть вам побудувати та запустити демонстраційний код. Вам рекомендується виконати ці дії, використовуючи код Visual Studio як середовище розробки. Використання коду Visual Studio для цих дій допомагає вам стати більш зручним написанням і виконанням коду в середовищі розробників, яке використовують професіонали по всьому світу.
Примітка
Якщо ви завершили інші модулі Microsoft Learn у цій серії C# , можливо, ви вже створили папку проекту для зразків коду. У такому разі можна пропустити наведений нижче розділ кроків і видалити код у файлі Program.cs, який використовувався для попередньої вправи.
Примітка
Зразки коду в цій вправі розроблені на основі en-US параметрів культури та використовують крапку (.) як десятковий роздільник. Створення та запуск коду з параметром культури, у якому використовуються різні десяткові роздільники (наприклад, кома ,), можуть призвести до неочікуваних результатів або помилок. Щоб вирішити цю проблему, замініть десяткові роздільники періоду в зразках коду на локальний десятковий роздільник (наприклад, ,).
Крім того, щоб запустити програму за допомогою параметра культури en-US, додайте такий код у верхній частині програми: using System.Globalization; і після будь-яких інших using інструкцій додайте CultureInfo.CurrentCulture = new CultureInfo("en-US");.
Відкрийте Код Visual Studio.
Щоб відкрити код Visual Studio, можна скористатися меню "Пуск" Windows (або еквівалентним ресурсом для іншої ОС).
У меню Код Visual Studio Файл виберіть Відкрити папку.
У діалоговому вікні Відкрити папку перейдіть до папки "Робочий стіл Windows".
Якщо у вас є інше розташування папки, де зберігаються проекти коду, натомість можна використовувати це розташування папки. Для цього навчання важливо мати розташування, яке легко знайти і запам'ятати.
У діалоговому вікні Відкрити папку виберіть Вибрати папку.
Якщо з'явиться діалогове вікно безпеки з запитанням, чи довіряєте ви авторам, виберіть Так.
У меню коду Visual Studio Code виберіть Новий термінал.
Зверніть увагу, що в командному рядку на панелі терміналів відображається шлях до папки для поточної папки. Наприклад:
C:\Users\someuser\Desktop>Щоб створити нову консольну програму в указаній папці, введіть командний рядок термінала:
dotnet new console -o ./CsharpProjects/TestProjectа потім натисніть клавішу Enter.Ця команда .NET CLI використовує шаблон програми .NET для створення нового проекту програми консолі C# у вказаному розташуванні папки. Ця команда створює папки CsharpProjects і TestProject і використовує TestProject як ім'я файлу
.csproj.На панелі EXPLORER розгорніть папку CsharpProjects.
Має відобразитися папка TestProject і два файли, файл програми C# з іменем Program.cs і файл проекту C# з іменем TestProject.csproj.
На панелі EXPLORER, щоб переглянути файл коду на панелі "Редактор", виберіть Program.cs.
Видалення наявних рядків коду.
Цей проект консолі C# використовується для створення, створення та запуску зразків коду під час цього модуля.
Закрийте панель терміналів.
Запитання. Чи можливо, що спроба змінити тип даних значення призведе до винятку під час виконання?
Компілятор C# намагається вмістити код, але не компілює операції, які можуть призвести до винятку. Коли ви розумієте основну проблему компілятора C#, легше зрозуміти, чому він функціонує певним чином.
Напишіть код, який намагається додати int та string та зберегти результат у int
Переконайтеся, що на панелі "Редактор" відкрито код Visual Studio Code і Program.cs.
Примітка
Program.cs має бути пустим. Якщо це не так, виберіть і видаліть усі рядки коду.
Введіть такий код у редактор коду Visual Studio:
int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);Тут ви намагаєтеся додати значення
2та4. Значення4має типstring. Чи працюватиме це?У меню Файл код Visual Studio Code виберіть Зберегти.
Перед створенням або запуском коду необхідно зберегти файл Program.cs.
На панелі EXPLORER, щоб відкрити термінал у розташуванні папки TestProject, клацніть правою кнопкою миші TestProject , а потім виберіть Відкрити в інтегрованому терміналі.
Панель терміналів має відкритися та містити командний рядок, який показує, що термінал відкрито в папці TestProject.
У командному рядку термінала, щоб запустити код, введіть
dotnet run, а потім натисніть клавішу Enter.Ви побачите такий приблизний вивід
C:\Users\someuser\Desktop\csharpprojects\TestProject\Program.cs(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'Примітка
Якщо відображається повідомлення "Не вдалося знайти проект для запуску", переконайтеся, що в командному рядку термінала відображається очікуване розташування папки TestProject. Наприклад:
C:\Users\someuser\Desktop\csharpprojects\TestProject>Зачекайте хвилинку, щоб зрозуміти, чому компілятору не вдалося запустити перший зразок коду.
Важлива частина повідомлення про помилку,
(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int', повідомляє, що проблема полягає в використанніstringтипу даних.Але чому компілятор C# не може просто впоратися з помилкою? Зрештою, ви можете виконати навпроти, щоб об'єднати число до
stringта зберегти його в змінній рядка. Тут ви змінюєте тип даних змінноїresultзintнаstring.Оновіть код у редакторі коду Visual Studio, як показано нижче.
int first = 2; string second = "4"; string result = first + second; Console.WriteLine(result);Збережіть кодовий файл, а потім за допомогою коду Visual Studio запустіть код.
Ви маєте дотримуватися наведених нижче результатів.
24Результат математично неправильний, але завершується поєднанням значень як символів "2" і "4".
Ще раз перевірте перший приклад коду, у якому змінна
resultмає типint. Код із повідомленням про помилку.int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);Чому компілятор C# не може зрозуміти, що потрібно розглядати змінну
second, що містить4як число, а неstring?
Компілятори роблять безпечні перетворення
Компілятор C# бачить потенційну проблему у створенні. Змінна second має тип string, тому може бути встановлено інше значення, наприклад "hello". Якщо компілятор C# спробував перетворити "hello" на число, яке спричинить виняток під час виконання. Щоб уникнути такої можливості, компілятор C# не виконує неявне перетворення з string на int.
З точки зору компілятора C# безпечніше перетворити int на string і натомість об'єднатися.
Якщо ви плануєте виконувати додавання за допомогою рядка, компілятор C# вимагає від вас більш явного контролю над процесом перетворення даних. Іншими словами, це змушує вас бути більш залученими, щоб ви могли поставити належні запобіжні заходи, щоб впоратися з можливістю перетворення може призвести до винятку.
Якщо потрібно змінити значення вихідного типу даних на новий, і ця зміна може призвести до винятку під час виконання, необхідно виконати перетворення даних.
Щоб виконати перетворення даних, можна скористатися одним із кількох методів:
- Використання допоміжного методу для типу даних
- Використання допоміжного методу для змінної
- Використання методів
Convertкласу
Перегляньте кілька прикладів цих методів перетворення даних пізніше в цій одиниці.
Запитання. Чи можливо, що спроба змінити тип даних значення призведе до втрати інформації?
Видаліть або скористайтеся оператором примітки рядка
//, щоб прокоментувати код із попереднього кроку вправи, і додайте такий код:int myInt = 3; Console.WriteLine($"int: {myInt}"); decimal myDecimal = myInt; Console.WriteLine($"decimal: {myDecimal}");Збережіть кодовий файл, а потім за допомогою коду Visual Studio запустіть код.
Ви побачите такий результат:
int: 3 decimal: 3Ключем до цього прикладу є цей рядок коду:
decimal myDecimal = myInt;Оскільки будь-яке
intзначення може легко вміститися всерединіdecimal, компілятор виконує перетворення.Термін розширення перетворення означає, що ви намагаєтеся перетворити значення з типу даних, який може містити менше інформації , щоб тип даних, який може містити більше інформації. У цьому випадку значення, яке зберігається в змінну типу,
intперетворено на змінну типуdecimal, не втрачає інформацію.Якщо ви знаєте, що виконуєте розширене перетворення, ви можете покладатися на неявне перетворення. Компілятор обробляє неявні перетворення.
Виконання акторського складу
Видаліть або скористайтеся оператором примітки рядка
//, щоб прокоментувати код із попереднього кроку вправи, і додайте такий код:decimal myDecimal = 3.14m; Console.WriteLine($"decimal: {myDecimal}"); int myInt = (int)myDecimal; Console.WriteLine($"int: {myInt}");Щоб виконати акторський склад, скористайтеся оператором лиття
(), щоб оточити тип даних, а потім розташуйте його поруч зі змінною, яку потрібно перетворити (наприклад,(int)myDecimal). Виконується явне перетворення на визначений тип даних (int).Збережіть кодовий файл, а потім за допомогою коду Visual Studio запустіть код.
Ви побачите такий результат:
decimal: 3.14 int: 3Ключем до цього прикладу є цей рядок коду:
int myInt = (int)myDecimal;Змінна
myDecimalмістить значення, яке має точність після десяткової коми. Додавши інструкцію з лиття(int), ви повідомляєте компілятору C# про те, що ви розумієте, що це можливо, ви втратите цю точність, і в цій ситуації все гаразд. Ви повідомляєте компілятору, що виконуєте навмисне перетворення, явне перетворення.
Визначте, чи перетворення є "розширенням перетворення" або "звуженням перетворення"
Термін звуження означає, що ви намагаєтеся перетворити значення з типу даних, яке може містити більше інформації на тип даних, який може містити менше інформації. У цьому випадку ви можете втратити такі відомості, як точність (тобто кількість значень після десяткової коми). Наприклад, це перетворення значення, яке зберігається в змінних типу decimal, на змінну типу int. Якщо надрукувати два значення, можливо, ви помітите втрату інформації.
Якщо відомо, що виконується звуження перетворення, потрібно виконати . Кастинг – це інструкція компілятора C# про те, що ви знаєте, що точність може бути втрачена, але ви готові прийняти її.
Якщо ви не впевнені, чи втратите дані під час перетворення, напишіть код для перетворення двома різними способами та спостерігайте за змінами. Розробники часто пишуть невеликі тести, щоб краще зрозуміти поведінку, як показано в наступному зразку.
Видаліть або скористайтеся оператором примітки рядка
//, щоб прокоментувати код із попереднього кроку вправи, і додайте такий код:decimal myDecimal = 1.23456789m; float myFloat = (float)myDecimal; Console.WriteLine($"Decimal: {myDecimal}"); Console.WriteLine($"Float : {myFloat}");Збережіть кодовий файл, а потім за допомогою коду Visual Studio запустіть код.
Виконайте наведені нижче дії.
Decimal: 1.23456789 Float : 1.2345679Ви можете помітити на виході, що перетворення
decimalнаfloat– це звуження, тому що ви втрачаєте точність.
Виконання перетворень даних
Раніше повідомлялося, що змінення значення з одного типу даних на інший може призвести до винятку середовища виконання, і слід виконати перетворення даних. Для перетворення даних можна використовувати три методи:
- Використання допоміжного методу для змінної
- Використання допоміжного методу для типу даних
- Використання методів
Convertкласу
Перетворення числа на ToString() за допомогою string
Кожна змінна типу даних має ToString() метод. Спосіб ToString() залежить від того, як він впроваджується за вказаним типом. Однак у більшості примітивів виконується розширення перетворення. Хоча це не обов'язково (оскільки ви можете покладатися на неявне перетворення в більшості випадків), він може повідомити іншим розробникам, що ви розумієте, що ви робите, і це навмисно.
Ось короткий приклад використання методу ToString() для явного перетворення int значень на string.
Видаліть або скористайтеся оператором примітки рядка
//, щоб прокоментувати код із попереднього кроку вправи, і додайте такий код:int first = 5; int second = 7; string message = first.ToString() + second.ToString(); Console.WriteLine(message);Збережіть кодовий файл, а потім за допомогою коду Visual Studio запустіть код. Під час запуску коду результат має відображати об'єднання двох значень:
57
Перетворення string на int за допомогою допоміжного методу Parse()
Більшість числових типів даних мають метод Parse(), який перетворює рядок на вказаний тип даних. У цьому випадку за допомогою методу Parse() можна перетворити два рядки на int значення, а потім додати їх разом.
Видаліть або скористайтеся оператором примітки рядка
//, щоб прокоментувати код із попереднього кроку вправи, і додайте такий код:string first = "5"; string second = "7"; int sum = int.Parse(first) + int.Parse(second); Console.WriteLine(sum);Збережіть кодовий файл, а потім за допомогою коду Visual Studio запустіть код. Під час запуску коду результат має відображати суму двох значень:
12Зачекайте, щоб спробувати виявити потенційну проблему з попереднім прикладом коду? Що робити, якщо для будь-якої зі змінних
firstабоsecondвстановлено значення, які не можна перетворити наint? Під час виконання виникла виняткова ситуація. Компілятор C# і середовище виконання очікують, що ви плануєте заздалегідь та запобігати "незаконним" перетворенням. Виняток середовища виконання можна зменшити кількома способами.Найпростіший спосіб зменшити цю ситуацію – скористатися
TryParse(), яка є кращою версією методуParse().
Перетворення string на int за допомогою класу Convert
Клас Convert має багато допоміжних методів перетворення значення з одного типу на інший. У наведеному нижче прикладі можна перетворити кілька рядків на значення типу int.
Видаліть або скористайтеся оператором примітки рядка
//, щоб прокоментувати код із попереднього кроку вправи, і додайте такий код:string value1 = "5"; string value2 = "7"; int result = Convert.ToInt32(value1) * Convert.ToInt32(value2); Console.WriteLine(result);Збережіть кодовий файл, а потім за допомогою коду Visual Studio запустіть код.
Ви побачите такий результат:
35Примітка
Чому ім'я методу
ToInt32()? Чому б неToInt()?System.Int32– це ім'я базового типу даних у бібліотеці класів .NET, який мова програмування C# відповідає ключовому словуint. Оскільки класConvertтакож входить до бібліотеки класу .NET, він називається повною назвою, а не назвою C#. Визначаючи типи даних як частину бібліотеки класу .NET, кілька мов .NET, наприклад Visual Basic, F#, IronPython та інші, можуть ділитися однаковими типами даних і тими ж класами в бібліотеці класу .NET.Метод
ToInt32()має 19 перевантажених версій, що дозволяє приймати практично кожен тип даних.ви використовували метод
Convert.ToInt32()з рядком тут, але, можливо, слід використовуватиTryParse().Отже, коли слід використовувати клас
Convert? КласConvertнайкраще підходить для перетворення дробової числа на цілі числа (int), оскільки округлюється вгору, як очікувалося.
Порівняння виливок і перетворення decimal на int
У наведеному нижче прикладі показано, що відбувається під час спроби перетворити decimal на int (звуження перетворення) і за допомогою методу Convert.ToInt32() перетворити ті самі decimal на int.
Видаліть або скористайтеся оператором примітки рядка
//, щоб прокоментувати код із попереднього кроку вправи, і додайте такий код:int value = (int)1.5m; // casting truncates Console.WriteLine(value); int value2 = Convert.ToInt32(1.5m); // converting rounds up Console.WriteLine(value2);Збережіть кодовий файл, а потім за допомогою коду Visual Studio запустіть код.
Ви побачите такий результат:
1 2
Обтинання обтинання та перетворення раундів
Коли ви кидаєте int value = (int)1.5m;, значення поплавця скорочується, тому результат 1, тобто значення після десяткового розряду ігнорується повністю. Ви можете змінити літерал float на 1.999m і результат лиття буде те ж саме.
Під час перетворення за допомогою Convert.ToInt32()літеральне значення float належним чином округлюється до 2. Якщо ви змінили значення літерала на 1.499m, його буде округлено до 1.
Повторити введення
Ви розглянули кілька важливих концепцій перетворення та лиття даних:
- Запобігання виникненню помилки середовища виконання під час перетворення даних
- Виконайте явний акторський склад, щоб повідомити компілятору, що ви розумієте ризик втрати даних
- Покладайтеся на компілятор, щоб виконувати неявний відлив під час виконання перетворення, що розширюється
- Щоб виконати акторський склад (наприклад,
()), скористайтеся оператором(int)myDecimalта типом даних. - Використовуйте клас
Convert, коли потрібно виконати звуження перетворення, але потрібно виконати округлення, а не скорочення даних
Перевірте свої знання
Зворотний зв’язок
Чи була ця сторінка корисна?
Ні
Потрібна допомога із цією темою?
Хочете скористатися Ask Learn, щоб отримати пояснення чи інструкції із цієї теми?