Chuyển đổi kiểu dữ liệu trong C#
Nguyễn Dương 07-06-2024Trong bài Biến trong C#, mình có lấy 1 ví dụ cho các bạn tập gõ chương trình. Trong ví dụ đó, bạn hãy để ý, các biến mình đều không gán giá trị khi khai báo mà giá trị của biến sẽ được nhập từ bàn phím. Về bản chất, giá trị nhập từ bàn phím là dạng chuỗi, máy tính sẽ không thể tính toán được với chuỗi ký tự. Vậy cho nên mình đã sử dụng một số câu lệnh chuyển đổi kiểu dữ liệu nhập vào (hay còn gọi là ép kiểu dữ liệu) từ dạng chuỗi sang dạng số.
1. ĐỊNH NGHĨA ÉP KIỂU DỮ LIỆU TRONG C#
Ép kiểu dữ liệu là chuyển đổi kiểu dữ liệu này sang kiểu dữ liệu khác để phục vụ cho các thao tác xử lý. Ví dụ chuyển từ kiểu chuỗi sang kiểu số nguyên, chuyển từ kiểu số nguyên sang kiểu số thực.
2. CÁC LOẠI ÉP KIỂU TRONG C#
Có 4 loại ép kiểu trong C# là:
- Chuyển đổi kiểu ngầm định
- Chuyển đổi kiểu tường minh
- Sử dụng phương thức, lớp hỗ trợ sẵn
- Người dùng tự định nghĩa kiểu chuyển đổi
Nào chúng ta hãy cùng tìm hiểu về 4 loại ép kiểu dữ liệu trong C#
2.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 đổi kiểu dữ liệ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ụ bạn không thể chuyển kiểu dữ liệu float (4bytes) sang kiểu int (2bytes) được, vì kích thước kiểu float lớn hơn kích thước kiểu int.
- Chuyển từ lớp con đến lớp cha
Ví dụ:
Việc chuyển đổi kiểu dữ liệu này được thực hiện khi muốn:
- Chuyển đổi kiểu dữ liệ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ụ bạn không thể chuyển kiểu dữ liệu float (4bytes) sang kiểu int (2bytes) được, vì kích thước kiểu float lớn hơn kích thước kiểu int.
- Chuyển từ lớp con đến lớp cha
Ví dụ:
int a = 5;
float b = a;
// float có miền giá trị lớn hơn int
2.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 từ khóa chỉ định chứ không dùng phương thức.
Trong chuyển đổi kiểu tường minh, bạn 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:
Cú pháp:
(<kiểu dữ liệu>) <biến cần ép kiểu>
Ví dụ:
int a = 256;
byte b = (byte)a;
Console.WriteLine("a = " +a);
Console.WriteLine("b = " +b);
Console.ReadKey();
Kết quả: a = 256 và b = 0.
Vì 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, 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 b sẽ mang giá trị là 0.
Vì 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, 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 b sẽ mang giá trị là 0.
2.3: Sử dụng phương thức, lớp hỗ trợ sẵn
- Phương thức Parse
Cú pháp:
<kiểu dữ liệu>.Parse(<dữ liệu cần chuyển đổi>);
- <kiểu dữ liệu> là kiểu dữ liệu cơ bản mình muốn chuyển đổi sang.
- <dữ liệu cần chuyển đổi> là dữ liệu thuộc kiểu chuỗi, có thể là biến kiểu chuỗi hoặc giá trị hằng kiểu chuỗi.
Ý nghĩa:
- Chuyển đổi một chuỗi sang một kiểu dữ liệu cơ bản tương ứng.
- Phương thức trả về giá trị kết quả chuyển kiểu nếu chuyển kiểu thành công. Ngược lại sẽ báo lỗi chương trình.
Ví dụ:
string BienKieuChuoi = "10"; int BienSoNguyen = int.Parse(BienKieuChuoi); double a = double.Parse("6.9"); Console.WriteLine(BienSoNguyen); Console.WriteLine(a); Console.ReadKey();
- Phương thức TryParse
Cú pháp:
<kiểu dữ liệu>.TryParse(<dữ liệu cần chuyển đổi>,out <biến chứa kết quả>);
<biến chứa kết quả> là biến mà bạn muốn lưu giá trị kết quả sau khi chuyển kiểu thành công. Từ khóa out là từ khóa bắt buộc phải có.
Ý nghĩa:
- Chuyển một chuỗi sang một kiểu dữ liệu cơ bản tương ứng.
- Phương thức sẽ trả về true nếu chuyển kiểu thành công và giá trị kết quả chuyển kiểu sẽ lưu vào <biến chứa kết quả>. Ngược lại sẽ trả về false và <biến chứa kết quả> sẽ mang giá trị 0.
Ví dụ:
int KetQua; // Biến chứa giá trị kết quả khi ép kiểu thành công
bool KiemTra; // Biến kiểm tra việc ép kiểu có thành công hay không
string a = "10", b = "Hello"; // Dữ liệu cần ép kiểu
KiemTra = int.TryParse(a, out KetQua); // Ép kiểu biến a thành kiểu số nguyên
Console.Write(KiemTra == true ? "Ep kieu thanh cong" : "Ep kieu bi loi"); // Sử dụng toán tử 3 ngôi để in ra màn hình việc ép kiểu đã thành công hay thất bại
Console.WriteLine("\nKetQua = " + KetQua); // In giá trị biến kết quả ra màn hình
KiemTra = int.TryParse(b, out KetQua);
Console.Write(KiemTra == true ? "Ep kieu thanh cong" : "Ep kieu bi loi");
Console.WriteLine("\nKetQua = " + KetQua);
Biến a ép được về kiểu int nên giá trị 10 được lưu vào biến KetQua. Biến b không ép được thành kiểu int nên biến KetQua mang giá trị 0.
Lưu ý sử dụng Parse và TryParse
- Tham số truyền vào phải là một chuỗi
- Cả 2 phương thức được gọi thông qua tên kiểu dữ liệu
- Parse sẽ báo lỗi nếu ép kiểu không thành công. Còn TryParse sẽ lưu giá trị 0 vào biến chứa kết quả nếu ép kiểu không thành công.
- Ngoài TryParse ra thì vẫn có một cách ép kiểu không báo lỗi chương trình. Đó là sử dụng toán tử as. Nếu ép kiểu không thành công thì trả kết quả là null
- Lớp hỗ trợ sẵn Convert- Tham số truyền vào phải là một chuỗi
- Cả 2 phương thức được gọi thông qua tên kiểu dữ liệu
- Parse sẽ báo lỗi nếu ép kiểu không thành công. Còn TryParse sẽ lưu giá trị 0 vào biến chứa kết quả nếu ép kiểu không thành công.
- Ngoài TryParse ra thì vẫn có một cách ép kiểu không báo lỗi chương trình. Đó là sử dụng toán tử as. Nếu ép kiểu không thành công thì trả kết quả là null
Convert là lớp tiện ích được C# hỗ trợ sẵn cung cấp cho chúng ta nhiều phương thức chuyển đổi kiểu dữ liệu.
- 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 | Mô 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 |
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 |
ToString | Chuyển đổi một kiểu thành kiểu 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 |
2.4: Người dùng tự định nghĩa kiểu chuyển đổi
Khi các ban tạo ra một kiểu dữ liệu mới thì các bạn cần định nghĩa các chuyển đổi kiểu dữ liệu từ kiểu cơ bản sang kiểu tự định nghĩa và ngược lại.
Bài viết liên quan
Hàm đệ quy trong C#
enum trong C#
Struct trong C#
Lớp String trong C#
Vòng lặp foreach trong C#
Mảng đa chiều, mảng của mảng trong C#