Chuyển đổi kiểu dữ liệu trong C#
Bài vừa rồi mình đã hướng dẫn các bạn về các kiểu dữ liệu trong C#. Những kiểu dữ liệu khác nhau có thể chứa những giá trị giống nhau. Vì thế trong một số trường hợp, ta cần đưa dữ liệu về dạng mong muốn, hay chuyển đổi sang một kiểu dữ liệu mới để dễ dàng thực hiện việc thao tác xử lý. Khi đó ta sẽ thực hiện việc ép kiểu dữ liệu (chuyển đổi kiểu dữ liệu này sang kiểu dữ liệu khác), vậy có bao nhiêu cách ép dữ liệu, và ép như thế nào. Ta hãy cùng nhau tìm hiểu nhé !
Ép kiểu có hai loại sau:
- Chuyển đổi kiểu ngầm định (implicit)
- Chuyển đổi kiểu tường minh (explicit)
1. Chuyển đổi kiểu ngầm định (implicit)
Chuyển đổi ngầm định là việc chuyển đổi được thực hiện bởi trình biên dịch và chúng ta không cần tác động gì đến.
Việc chuyển đổi kiểu dữ liệu này được thực hiện khi muốn chuyển dữ kiệu nhỏ sang kiểu dữ liệu lớn hơn có nghĩa là kích thước kiểu dữ liệu trước phải nhỏ hơn kích thước của kiểu dữ liệu sau. Ví dụ: Chúng ta không thể chuyển kiểu dữ liệu float
(4bytes) sang kiểu int
(2bytes), vì ta thấy kích thước kiểu float
lớn hơn so với kích thước kiểu int
. Cho nên ta phải làm ngược lại:
Bài viết này được đăng tại [free tuts .net]
int abc = 20; float xyz = abc; // Chuyển kiểu ngầm định vì kiểu float có miền giá trị lớn hơn kiểu int
2. Chuyển đổi kiểu tường minh (explicit)
Chuyển đổi tường minh là việc chuyển đổi được thực hiện một cách rõ ràng bởi yêu cầu của người lập trình bằng cách sử dụng các hàm được định nghĩa trước hay cần một toán tử cast
.
Trong chuyển đổi kiểu tường minh, ta có thể chuyển kiểu dữ liệu lớn về kiểu dữ liệu có kích thước nhỏ hơn mà không báo lỗi. Nếu kiểu dữ liệu vượt quá miền giá trị của kiểu dữ liệu ta muốn ép về thì chương trình sẽ tự động cắt bit sao cho phù hợp với khả năng chứa kiểu dữ liệu đó.
Cú pháp: (<kiểu dữ liệu>) <biến cần ép kiểu>
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace freetuts { class Program { static void Main(string[] args) { int abc = 256; //cast kiểu dữ liệu int thành kiểu dữ liệu byte byte xyz = (byte)abc; Console.WriteLine("abc = " + abc); Console.WriteLine("xyz = " + xyz); Console.ReadKey(); } } }
Kết quả chạy của chương trình trên là:
Ta thấy 256 có mã nhị phân là 100000000 do kiểu byte
có giới hạn chỉ đến 255 nên không thể chứa 256 được. Kiểu byte
có kích thước là 1 byte
tương đương với 8 bit
, như vầy chương trình sẽ cắt mã nhị phân của 256 về còn 8 bit
từ trái sang. Ta được 00000000 (đủ 8 bit) tương đương với 0. Vậy biến xyz
sẽ mang giá trị là 0.
Lưu ý: Ban đầu ta thấy biến abc = 256
nhưng khi ép kiểu thì giá trị của xyz = 0
. Vậy nên, khi ép kiểu dữ liệu chúng ta phải thật sự cẩn thận nếu không sẽ làm ảnh hưởng đến kết quả của toàn bộ bài toán.
Ngoài ra chúng ta còn có một số phương thức chuyển đổi kiểu dữ liệu trong C# nằm trong lớp tiện ích Convert
.
Các đặc điểm của các phương thức trong lớp Convert
:
- Nếu tham số truyền vào là null thì các phương thức sẽ trả về giá trị mặc định của kiểu dữ liệu.
- Nếu tham số truyền vào sai định dạng hay vượt quá giới hạn thì chương trình sẽ báo lỗi.
- Các tham số truyền vào các phương thức có thể là mọi kiểu dữ liệu cơ bản.
Bảng các phương thức chuyển đổi kiểu có sẵn trong C#:
Phương thức | Miêu tả |
---|---|
ToBoolean |
Chuyển đổi một kiểu thành một giá trị Boolean nếu có thể |
ToByte |
Chuyển đổi một kiểu thành một byte |
ToChar |
Chuyển đổi một kiểu thành một Unicode Character, nếu có thể |
ToDateTime |
Chuyển đổi một kiểu (integer hoặc string) thành các cấu trúc datetime |
ToDecimal |
Chuyển đổi một kiểu số thực hoặc số nguyên thành kiểu thập phân |
ToDouble |
Chuyển một kiểu thành kiểu double |
ToInt16 |
Chuyển đổi một kiểu thành một 16-bit integer |
ToInt32 |
Chuyển đổi một kiểu thành một 32-bit integer |
ToInt64 |
Chuyển đổi một kiểu thành một 64-bit integer |
ToSbyte |
Chuyển đổi một kiểu thành một kiểu signed byte |
ToSingle |
Chuyển đổi một kiểu thành một số small floating point |
ToSing |
Chuyển đổi một kiểu thành một String |
ToType |
Chuyển đổi một kiểu thành một kiểu đã xác định |
ToUInt16 |
Chuyển đổi một kiểu thành kiểu unsigned int |
ToUInt32 |
Chuyển đổi một kiểu thành unsigned long |
ToUInt64 |
Chuyển đổi một kiểu thành một unsigned big integer |
3. Ví dụ
Một ví dụ nhỏ minh họa cho việc chuyển đổi bằng hai phương pháp ép kiểu nêu trên:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace freetuts.net { class freetuts { static void Main(string[] args) { int variable_1 = 16; double variable_2 = 211.98156; // IMPLICIT CASTING double result_1 = variable_1; Console.WriteLine("\ngia tri cua bien result_1 sau khi ep kieu = " + result_1); // 16.0 // EXPLICIT CASTING int result_2 = (int)variable_2; Console.WriteLine("\ngia tri cua bien result_2 sau khi ep kieu = " + result_2); // 211 Console.WriteLine("\n\n freetuts chuc ban hoc tot !!!"); Console.ReadKey(); } } }
Biên dịch chương trình cho ta thấy kết quả:
Ta thấy giá trị của biến result_1 = variable_1
vì kích thước của kiểu giá trị float > int
nên giá trị của nó sau khi ép kiểu không thay đổi. Ngược lại, ở biến result_2 < variable_2
bởi vì kiểu int là kiểu số nguyên nên nó không thể chứa kiểu double được, vì vậy nên phần thập phân phía sau sẽ được làm tròn.
Có một loại ép kiểu chúng ta thường xuyên dùng đó là ép từ kiểu string sang kiểu số. Vì những gì nhập từ bàn phím đều cho giá trị là chuỗi nên ta cần thực hiện phép chuyển đổi này trước khi sử dụng:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace freetuts.net { class freetuts { static void Main(string[] args) { int variable; Console.WriteLine("\nnhap vao mot so !"); //variable = Console.ReadLine();// không thể gán được bởi vì variable là kiểu int variable = Convert.ToInt16(Console.ReadLine()); //thực hiện ép kiểu Console.WriteLine("\nso ban vua nhap: " + variable); Console.WriteLine("\n\n freetuts chuc ban hoc tot !!!"); Console.ReadKey(); } } }
Biên dịch chương trình chúng ta sẽ nhận được kết quả:
3. Kết luận
Vậy là qua bài này mình và các bạn đã tìm hiểu thế nào là ép kiểu, tại sao phải ép kiểu và các loại ép kiểu. Bài sau mình và các bạn sẽ cùng tìm hiểu biến và hằng trong C# nhé. Hẹn gặp lại các bạn, chúc các bạn học tốt và luôn đồng hành cùng freetuts.net nhé !