16 tháng 3, 2020

Chuyển đổi kiểu dữ liệu trong C#

Trong 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ố. 

Chuyển đổi kiểu dữ liệu trong C#

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ụ
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(<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.

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<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
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.

SHARE THIS

Blogger Nguyễn Dương

Có một câu nói mà mình rất thích đó là "Thật sai lầm khi nghĩ rằng một khi rời khỏi trường học, bạn không cần học thêm điều mới nữa". Chính vì thế mà hãy luôn luôn học hỏi, con người chỉ ngừng phát triển khi ngừng học hỏi. Nếu như bạn chưa hiểu nội dung bài viết hoặc đang khúc mắc khi thao tác thì hãy bình luận phía dưới bài viết để mọi người cùng thảo luận nhé!