Bài tập - Khám phá tính năng truyền và chuyển đổi kiểu dữ liệu

Đã hoàn thành 200 XP

Có nhiều kỹ thuật để thực hiện chuyển đổi kiểu dữ liệu. Kỹ thuật bạn chọn tùy thuộc vào câu trả lời của bạn cho hai câu hỏi quan trọng:

  • Có thể, tùy thuộc vào giá trị mà việc cố thay đổi kiểu dữ liệu của giá trị sẽ trả về một ngoại lệ vào thời gian chạy không?
  • Có thể, tùy thuộc vào giá trị mà việc cố thay đổi kiểu dữ liệu của giá trị có thể dẫn đến việc mất thông tin không?

Trong bài tập này, bạn làm việc theo cách của bạn thông qua các câu hỏi này, ngụ ý của câu trả lời của họ, và kỹ thuật bạn nên sử dụng khi bạn cần thay đổi loại dữ liệu.

Chuẩn bị môi trường mã hóa của bạn

Mô-đun này bao gồm các hoạt động thực hành hướng dẫn bạn qua quy trình xây dựng và chạy mã minh họa. Bạn được khuyến khích hoàn thành các hoạt động này bằng cách sử dụng Visual Studio Code làm môi trường phát triển của mình. Việc sử dụng Visual Studio Code cho các hoạt động này sẽ giúp bạn viết và chạy mã thoải mái hơn trong môi trường nhà phát triển được các chuyên gia trên toàn thế giới sử dụng.

Lưu ý

Nếu bạn đã hoàn thành các mô-đun Microsoft Learn khác trong chuỗi C# này, bạn có thể đã tạo một thư mục dự án cho các mẫu mã. Nếu trường hợp này xảy ra, bạn có thể bỏ qua phần sau đây của các bước và xóa mã trong tệp Program.cs được sử dụng cho bài tập trước đó.

Lưu ý

Các mẫu mã trong bài tập này được thiết kế dựa trên en-US văn hóa, và sử dụng một dấu chấm (.) làm dấu tách thập phân. Việc xây dựng và chạy mã với cài đặt văn hóa sử dụng dấu tách thập phân khác (chẳng hạn như dấu phẩy ,) có thể cho kết quả hoặc lỗi không mong muốn. Để khắc phục sự cố này, hãy thay dấu tách thập phân của dấu chấm trong mẫu mã bằng dấu tách thập phân cục bộ của bạn (chẳng hạn như ,). Ngoài ra, để chạy chương trình bằng cách sử dụng cài đặt văn hóa en-US, hãy thêm mã sau vào đầu chương trình của bạn: using System.Globalization; và sau bất kỳ câu lệnh using nào khác thêm CultureInfo.CurrentCulture = new CultureInfo("en-US");.

  1. Mở Mã Visual Studio.

    Bạn có thể sử dụng menu Bắt đầu của Windows (hoặc tài nguyên tương đương cho một HĐH khác) để mở Mã Visual Studio.

  2. Trên menu Mã Visual Studio tệp, chọn mở thư mục.

  3. Trong hộp thoại mở thư, dẫn hướng đến thư mục Trên máy tính chạy Windows.

    Nếu bạn có vị trí thư mục khác nơi bạn giữ dự án mã, bạn có thể sử dụng vị trí thư mục đó để thay thế. Đối với khóa đào tạo này, điều quan trọng là phải có một vị trí dễ định vị và ghi nhớ.

  4. Trong hộp Mở Thư mục, hãy chọn Chọn Thư mục.

    Nếu bạn thấy một hộp thoại bảo mật hỏi xem bạn có tin cậy tác giả hay không, hãy chọn .

  5. Trên menu Thiết bị đầu cuối Visual Studio, hãy chọn thiết bị đầu cuối.

    Lưu ý rằng dấu nhắc lệnh trong pa-nen Đầu cuối sẽ hiển thị đường dẫn thư mục cho thư mục hiện tại. Chẳng hạn:

    dos
    C:\Users\someuser\Desktop>
    
  6. Để tạo ứng dụng bảng điều khiển mới trong thư mục được chỉ định, tại loại dấu nhắc lệnh Đầu cuối: dotnet new console -o ./CsharpProjects/TestProject sau đó nhấn Enter.

    Lệnh .NET CLI này sử dụng mẫu chương trình .NET để tạo dự án ứng dụng bảng điều khiển C# mới trong vị trí thư mục được chỉ định. Lệnh này tạo ra các thư mục CsharpProjects và TestProject cho bạn và sử dụng TestProject làm tên của tệp .csproj này.

  7. Trong pa nen EXPLORER, bung rộng CsharpProjects mục.

    Bạn sẽ thấy thư mục TestProject và hai tệp, một tệp chương trình C# có tên Program.cs và một tệp dự án C# có tên là TestProject.csproj.

  8. Trong pa nen EXPLORER, để xem tệp mã của bạn trong panel Trình soạn thảo, hãy chọn Program.cs.

  9. Xóa bỏ các dòng mã hiện có.

    Bạn sử dụng dự án bảng điều khiển C# này để tạo, xây dựng và chạy mẫu mã trong mô-đun này.

  10. Đóng pa-nen Đầu cuối.

Hỏi: Có thể là cố gắng thay đổi kiểu dữ liệu của giá trị sẽ đưa ra một ngoại lệ tại thời gian chạy?

Trình biên dịch C# cố gắng xử lý mã của bạn, nhưng không biên dịch các thao tác có thể dẫn đến một ngoại lệ. Khi bạn hiểu mối quan tâm chính của trình biên dịch C#, hãy hiểu tại sao nó hoạt động theo một cách nhất định dễ dàng hơn.

Viết mã cố gắng thêm một int và một string và lưu kết quả trong một tài int

  1. Đảm bảo rằng bạn đã mở Mã Visual Studio và Program.cs hiển thị trong ngăn Trình soạn thảo.

    Lưu ý

    Program.cs phải trống. Nếu không, hãy chọn và xóa tất cả các dòng mã.

  2. Nhập mã sau vào Trình soạn thảo Mã Visual Studio:

    C#
    int first = 2;
    string second = "4";
    int result = first + second;
    Console.WriteLine(result);
    

    Ở đây, bạn đang cố gắng thêm các giá trị 24. Giá trị 4 thuộc loại string. Thao tác này có hiệu quả không?

  3. Trên menu Cài đặt Mã Visual Studio tệp, chọn Lưu tệp.

    Tệp Program.cs phải được lưu trước khi xây dựng hoặc chạy mã.

  4. Trong pa nen EXPLORER, để mở Một Thiết bị đầu cuối tại vị trí thư mục TestProject của bạn, hãy bấm chuột phải vào TestProject, sau đó chọn Mở trong Thiết bị đầu cuối tích hợp.

    Một bảng điều khiển đầu cuối nên mở ra, và nên bao gồm một dấu nhắc lệnh cho thấy rằng thiết bị đầu cuối được mở vào vị trí thư mục TestProject của bạn.

  5. Tại dấu nhắc lệnh Thiết bị đầu cuối, để chạy mã của bạn, dotnet run nhập và sau đó nhấn Enter.

    Bạn sẽ thấy kết quả gần đúng sau đây

    Output
    C:\Users\someuser\Desktop\csharpprojects\TestProject\Program.cs(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'
    

    Lưu ý

    Nếu bạn thấy thông báo cho biết "Không thể tìm thấy dự án để chạy", hãy đảm bảo rằng dấu nhắc lệnh Thiết bị đầu cuối hiển thị vị trí thư mục TestProject dự kiến. Ví dụ: C:\Users\someuser\Desktop\csharpprojects\TestProject>

  6. Dành một phút để xem xét lý do tại sao trình biên dịch không thể chạy mẫu mã đầu tiên.

    Phần quan trọng của thông báo lỗi, (3,14): error CS0029: Cannot implicitly convert type 'string' to 'int', cho bạn biết sự cố là sử dụng kiểu dữ string liệu.

    Nhưng tại sao Trình biên dịch C# không thể chỉ xử lý lỗi? Sau khi tất cả, bạn có thể thực hiện đối diện ghép một số vào một string và lưu nó trong một biến chuỗi. Tại đây, bạn thay đổi kiểu dữ liệu của result biến từ int thành string.

  7. Cập nhật mã của bạn trong Trình soạn thảo Mã Visual Studio như sau:

    C#
    int first = 2;
    string second = "4";
    string result = first + second;
    Console.WriteLine(result);
    
  8. Lưu tệp mã của bạn, sau đó sử dụng Mã Visual Studio để chạy mã của bạn.

    Bạn nên quan sát đầu ra sau đây:

    Output
    24
    

    Kết quả sai về mặt toán học nhưng hoàn tất bằng cách kết hợp các giá trị như các ký tự "2" và "4".

  9. Kiểm tra, một lần nữa, các ví dụ mã đầu tiên result biến là loại int. Mã kèm theo thông báo lỗi.

    C#
    int first = 2;
    string second = "4";
    int result = first + second;
    Console.WriteLine(result);
    

    Tại sao trình biên dịch C# không thể tìm ra rằng bạn muốn coi biến số second chứa 4 là một số, không phải là số string?

Trình biên soạn thực hiện chuyển đổi an toàn

Trình biên dịch C# thấy vấn đề tiềm ẩn trong việc thực hiện. Biến số second thuộc loại string, vì vậy nó có thể được đặt thành một giá trị khác như "hello". Nếu trình biên dịch C# đã tìm cách chuyển đổi "hello" thành một số có thể gây ra ngoại lệ trong thời gian chạy. Để tránh khả năng này, trình biên dịch C# không ngầm định thực hiện chuyển đổi từ string thành int cho bạn.

Từ góc độ biên dịch C#, thao tác an toàn hơn sẽ là chuyển đổi int đổi thành một string và thực hiện ghép nối thay vào đó.

Nếu bạn định thực hiện thêm bằng cách sử dụng một chuỗi, trình biên dịch C# yêu cầu bạn kiểm soát rõ ràng hơn quy trình chuyển đổi dữ liệu. Nói cách khác, nó buộc bạn phải tham gia nhiều hơn để bạn có thể đặt các biện pháp phòng ngừa thích hợp tại chỗ để xử lý khả năng chuyển đổi có thể đưa ra một ngoại lệ.

Nếu bạn cần thay đổi một giá trị từ kiểu dữ liệu gốc sang kiểu dữ liệu mới và thay đổi có thể tạo ra một ngoại lệ tại thời gian chạy, bạn phải thực hiện chuyển dữ liệu.

Để thực hiện chuyển đổi dữ liệu, bạn có thể sử dụng một trong một số kỹ thuật:

  • Sử dụng phương pháp trợ giúp về kiểu dữ liệu
  • Sử dụng phương pháp trợ giúp trên biến số
  • Sử dụng các Convert phương pháp của lớp

Bạn xem xét một vài ví dụ về các kỹ thuật này để chuyển đổi dữ liệu sau này trong đơn vị này.

Hỏi: Việc cố thay đổi kiểu dữ liệu của giá trị có thể dẫn đến mất thông tin không?

  1. Xóa hoặc sử dụng toán tử chú thích // để nhận xét mã từ bước bài tập trước đó và thêm mã sau đây:

    C#
    int myInt = 3;
    Console.WriteLine($"int: {myInt}");
    
    decimal myDecimal = myInt;
    Console.WriteLine($"decimal: {myDecimal}");
    
  2. Lưu tệp mã của bạn, sau đó sử dụng Mã Visual Studio để chạy mã của bạn.

    Bạn sẽ thấy đầu ra sau đây:

    Output
    int: 3
    decimal: 3
    

    Chìa khóa cho ví dụ này là dòng mã:

    C#
    decimal myDecimal = myInt;
    

    Vì bất kỳ int giá trị nào cũng có thể dễ dàng khớp bên trong decimal, trình biên dịch sẽ thực hiện chuyển đổi.

    Thuật ngữ mở rộng chuyển đổi nghĩa là bạn đang cố gắng chuyển đổi một giá trị từ một kiểu dữ liệu có thể chứa ít thông tin hơn thành một kiểu dữ liệu có thể chứa thông tin nhiều hơn. Trong trường hợp này, một giá trị được lưu trữ trong một biến loại int đổi thành một biến loại decimal, không mất thông tin.

    Khi bạn biết mình đang thực hiện chuyển đổi mở rộng, bạn có thể dựa vào chuyển đổi ngầm của. Trình biên dịch xử lý chuyển đổi ngầm.

Thực hiện diễn viên

  1. Xóa hoặc sử dụng toán tử chú thích // để nhận xét mã từ bước bài tập trước đó và thêm mã sau đây:

    C#
    decimal myDecimal = 3.14m;
    Console.WriteLine($"decimal: {myDecimal}");
    
    int myInt = (int)myDecimal;
    Console.WriteLine($"int: {myInt}");
    

    Để thực hiện truyền, bạn sử dụng toán tử truyền () để bao quanh kiểu dữ liệu, sau đó đặt nó bên cạnh biến bạn muốn chuyển đổi (ví dụ: (int)myDecimal). Bạn thực hiện một chuyển đổi rõ sang kiểu dữ liệu truyền đã xác định (int).

  2. Lưu tệp mã của bạn, sau đó sử dụng Mã Visual Studio để chạy mã của bạn.

    Bạn sẽ thấy đầu ra sau đây:

    Output
    decimal: 3.14
    int: 3
    

    Chìa khóa cho ví dụ này là dòng mã:

    C#
    int myInt = (int)myDecimal;
    

    Biến số myDecimal giữ một giá trị có độ chính xác sau dấu thập phân. Bằng cách thêm (int)hướng dẫn truyền , bạn đang nói với trình biên dịch C# rằng bạn hiểu rằng có thể bạn sẽ mất độ chính xác đó và trong tình huống này, điều đó cũng tốt. Bạn đang cho trình biên dịch biết rằng bạn đang thực hiện chuyển đổi có chủ ý, một chuyển đổi minh.

Xác định xem chuyển đổi của bạn là "mở rộng chuyển đổi" hay "thu hẹp chuyển đổi"

Thuật ngữ thu hẹp chuyển đổi có nghĩa là bạn đang cố gắng chuyển đổi một giá trị từ một kiểu dữ liệu có thể chứa nhiều thông tin hơn thành một kiểu dữ liệu có thể chứa ít thông tin hơn. Trong trường hợp này, bạn có thể mất thông tin như độ chính xác (nghĩa là số lượng giá trị sau dấu thập phân). Một ví dụ là chuyển đổi giá trị được lưu trữ trong một biến decimal thành một biến loại int. Nếu bạn in hai giá trị này, bạn sẽ có thể nhận thấy việc mất thông tin.

Khi bạn biết mình đang thực hiện một chuyển đổi thu hẹp, bạn cần thực hiện diễn. Truyền là một hướng dẫn cho trình biên dịch C# mà bạn biết độ chính xác có thể bị mất, nhưng bạn sẵn sàng chấp nhận nó.

Nếu bạn không chắc liệu mình có bị mất dữ liệu trong quá trình chuyển đổi hay không, hãy viết mã để thực hiện chuyển đổi theo hai cách khác nhau và quan sát các thay đổi. Các nhà phát triển thường viết các bài kiểm tra nhỏ để hiểu rõ hơn các hành vi, như được minh họa với mẫu tiếp theo.

  1. Xóa hoặc sử dụng toán tử chú thích // để nhận xét mã từ bước bài tập trước đó và thêm mã sau đây:

    C#
    decimal myDecimal = 1.23456789m;
    float myFloat = (float)myDecimal;
    
    Console.WriteLine($"Decimal: {myDecimal}");
    Console.WriteLine($"Float  : {myFloat}");
    
  2. Lưu tệp mã của bạn, sau đó sử dụng Mã Visual Studio để chạy mã của bạn.

    Bạn sẽ thấy đầu ra tương tự như:

    Output
    Decimal: 1.23456789
    Float  : 1.2345679
    

    Bạn có thể quan sát từ đầu ra đặt decimal thành float là một chuyển đổi hẹp vì bạn đang mất độ chính xác.

Thực hiện Chuyển đổi Dữ liệu

Trước đó, có thông báo rằng việc thay đổi giá trị từ kiểu dữ liệu này sang kiểu khác có thể gây ra ngoại lệ thời gian chạy và bạn nên thực hiện chuyển đổi dữ liệu. Đối với chuyển đổi dữ liệu, có ba kỹ thuật mà bạn có thể sử dụng:

  • Sử dụng phương pháp trợ giúp trên biến số
  • Sử dụng phương pháp trợ giúp về kiểu dữ liệu
  • Sử dụng các Convert phương pháp của lớp

Sử ToString() để chuyển đổi một số thành số string

Mỗi biến kiểu dữ liệu đều có một ToString() khác nhau. Phương pháp ToString() nào phụ thuộc vào cách nó được thực hiện trên một loại nhất định. Tuy nhiên, trên hầu hết các nguyên thủy, nó thực hiện chuyển đổi mở rộng. Mặc dù điều này không hoàn toàn cần thiết (vì bạn có thể dựa vào chuyển đổi ngầm trong hầu hết các trường hợp) nhưng nó có thể giao tiếp với các nhà phát triển khác rằng bạn hiểu được mình đang làm gì và đó là chủ đích.

Đây là ví dụ nhanh về việc sử dụng phương pháp ToString() để chuyển đổi rõ ràng int giá trị thành strings.

  1. Xóa hoặc sử dụng toán tử chú thích // để nhận xét mã từ bước bài tập trước đó và thêm mã sau đây:

    C#
    int first = 5;
    int second = 7;
    string message = first.ToString() + second.ToString();
    Console.WriteLine(message);
    
  2. Lưu tệp mã của bạn, sau đó sử dụng Mã Visual Studio để chạy mã của bạn. Khi bạn chạy mã, kết quả sẽ hiển thị ghép nối hai giá trị:

    Output
    57
    

Chuyển đổi một string thành công cụ int dùng phương pháp Parse() trợ giúp

Hầu hết các kiểu dữ liệu số đều có phương Parse(), phương pháp này sẽ chuyển đổi một chuỗi thành kiểu dữ liệu đã cho. Trong trường hợp này, bạn sử dụng phương pháp Parse() để chuyển đổi hai chuỗi thành int trị, sau đó thêm chúng lại với nhau.

  1. Xóa hoặc sử dụng toán tử chú thích // để nhận xét mã từ bước bài tập trước đó và thêm mã sau đây:

    C#
    string first = "5";
    string second = "7";
    int sum = int.Parse(first) + int.Parse(second);
    Console.WriteLine(sum);
    
  2. Lưu tệp mã của bạn, sau đó sử dụng Mã Visual Studio để chạy mã của bạn. Khi bạn chạy mã, kết quả sẽ hiển thị tổng của hai giá trị:

    Output
    12
    
  3. Bạn mất một phút để tìm cách phát hiện sự cố tiềm ẩn với ví dụ về mã trước đó? Điều gì sẽ xảy ra nếu một trong hai first hoặc second được đặt thành các giá trị không thể chuyển đổi thành giá int? Một ngoại lệ được đưa ra ở thời gian chạy. Trình biên dịch và thời gian chạy C# dự kiến bạn sẽ lập kế hoạch trước và ngăn chặn chuyển đổi "bất hợp pháp". Bạn có thể giảm thiểu ngoại lệ thời gian chạy theo một số cách.

    Cách dễ nhất để giảm thiểu tình huống này là sử dụng TryParse(), đó là một phiên bản tốt hơn của phương pháp Parse() này.

Chuyển đổi một string thành một int dùng lớp Convert này

Lớp Convert có nhiều phương pháp trợ giúp để chuyển đổi một giá trị từ loại này sang loại khác. Trong ví dụ mã sau đây, bạn chuyển đổi một vài chuỗi thành các giá trị thuộc kiểu int.

  1. Xóa hoặc sử dụng toán tử chú thích // để nhận xét mã từ bước bài tập trước đó và thêm mã sau đây:

    C#
    string value1 = "5";
    string value2 = "7";
    int result = Convert.ToInt32(value1) * Convert.ToInt32(value2);
    Console.WriteLine(result);
    
  2. Lưu tệp mã của bạn, sau đó sử dụng Mã Visual Studio để chạy mã của bạn.

    Bạn sẽ thấy đầu ra sau đây:

    Output
    35
    

    Lưu ý

    Tại sao tên phương thức lại ToInt32()? Tại sao không ToInt()? System.Int32 là tên của kiểu dữ liệu cơ sở trong Thư viện Lớp .NET mà ngôn ngữ lập trình C# ánh xạ đến từ khóa int. Vì lớp Convert cũng là một phần của Thư viện Lớp .NET, nó được gọi bằng tên đầy đủ, không phải tên C# của nó. Bằng cách xác định các kiểu dữ liệu như một phần của Thư viện Lớp .NET, nhiều ngôn ngữ .NET như Visual Basic, F#, IronPython và các ngôn ngữ khác có thể chia sẻ cùng kiểu dữ liệu và các lớp giống nhau trong Thư viện Lớp .NET.

    Phương ToInt32() có 19 phiên bản quá tải cho phép chấp nhận hầu như mọi kiểu dữ liệu.

    bạn đã sử dụng Convert.ToInt32() phương pháp này với một chuỗi ở đây, nhưng bạn có thể sử dụng TryParse() khi có thể.

    Vì vậy, khi nào bạn nên sử dụng các lớp học Convert? Lớp Convert nhất để chuyển đổi số thập phân thành số nguyên (int) vì nó làm tròn lên theo cách bạn mong đợi.

So sánh tính năng truyền và chuyển đổi decimal chuyển đổi thành int

Ví dụ sau đây minh họa điều gì sẽ xảy ra khi bạn cố gắng truyền decimal thành int (một chuyển đổi thu hẹp) so với sử dụng phương pháp Convert.ToInt32() để chuyển đổi cùng một decimal thành một int.

  1. Xóa hoặc sử dụng toán tử chú thích // để nhận xét mã từ bước bài tập trước đó và thêm mã sau đây:

    C#
    int value = (int)1.5m; // casting truncates
    Console.WriteLine(value);
    
    int value2 = Convert.ToInt32(1.5m); // converting rounds up
    Console.WriteLine(value2);
    
  2. Lưu tệp mã của bạn, sau đó sử dụng Mã Visual Studio để chạy mã của bạn.

    Bạn sẽ thấy đầu ra sau đây:

    Output
    1
    2
    

Đúc cắt cụt và chuyển đổi vòng

Khi bạn đang truyền int value = (int)1.5m;, giá trị của phao bị cắt bớt để kết quả được 1, nghĩa là giá trị sau khi thập phân được bỏ qua hoàn toàn. Bạn có thể thay đổi float ký tự 1.999m và kết quả của đúc sẽ là như nhau.

Khi bạn chuyển đổi bằng cách sử Convert.ToInt32(), giá trị trôi nổi bằng chữ được làm tròn lên đúng 2. Nếu bạn thay đổi giá trị chữ thành 1.499m, thì giá trị đó sẽ được làm tròn xuống 1.

Recap

Bạn đề cập đến một số khái niệm quan trọng về chuyển đổi và truyền dữ liệu:

  • Ngăn lỗi thời gian chạy trong khi thực hiện chuyển đổi dữ liệu
  • Thực hiện diễn viên rõ ràng để cho trình biên dịch biết bạn hiểu nguy cơ mất dữ liệu
  • Dựa vào trình biên dịch để thực hiện diễn biến ngầm khi thực hiện chuyển đổi mở rộng
  • Sử dụng toán tử () truyền dữ liệu và kiểu dữ liệu để thực hiện truyền (ví dụ: (int)myDecimal)
  • Dùng lớp Convert khi bạn muốn thực hiện chuyển đổi thu hẹp nhưng muốn thực hiện làm tròn, không phải là cắt bớt thông tin

Kiểm tra kiến thức của bạn

1.

Kỹ thuật tốt nhất để chuyển đổi bằng cách làm tròn kiểu thập phân thành kiểu int trong C#?

2.

Chuyển đổi nào sau đây làm tròn giá trị (so với cắt cụt)?


Bài học tiếp theo: Bài tập - Kiểm tra phương pháp TryParse()

Trước Tiếp theo