Những đối tượng của một kiểu dữ liệu này có thể được chuyển sang những đối tượng của một kiểu dữ liệu khác thông qua cơ chế chuyển đổi tường minh hay ngầm định. Chuyển đổi ngầm định được thực hiện một cách tự động, trình biên dịch sẽ thực hiện cơng việc này. Cịn chuyển đổi tường minh diễn ra khi gán ép một giá trị cho kiểu dữ liệu khác.
Việc chuyển đổi giá trị ngầm định được thực hiện một cách tự động và đảm bảo là không mất thơng tin. Ví dụ, có thể gán ngầm định một số kiểu short (2 byte) vào một số kiểu int (4 byte) một cách ngầm định. Sau khi gán hồn tồn khơng mất dữ liệu vì bất cứ giá trị nào của short cũng thuộc về int
short x = 10;
int y = x; // chuyển đổi ngầm định
Tuy nhiên, nếu chuyển đổi ngược lại, chắc chắn sẽ bị mất thông tin. Nếu giá trị của số nguyên đó lớn hơn 32.767 thì nó sẽ bị cắt khi chuyển đổi. Trình biên dịch sẽ không thực hiện việc chuyển đổi ngầm định từ số kiểu int sang số kiểu short:
Tài liệu giảng dạy Th p T nh 1 Trang 43
Lỗi:
Để không bị lỗi phải dùng lệnh gán tường minh, đoạn mã trên được viết lại như sau:
Kết quả:
Trong C # khơng phải tất cả các kiểu có thể được chuyển đổi sang tất cả các kiểu khác, mà chỉ với một số trong số chúng. Chuyển đổi kiểu trong C # bao gồm ba loại:
- Chuyển đổi ngầm định - Chuyển đổi tường minh
- Chuyển đổi sang chuỗi hoặc từ chuỗi
3.3.1.CHUYỂN ĐỔI NGẦM ĐỊNH
Chuyển đổi kiểu ngầm định chỉ có thể thực hiện khi khơng có nguy cơ mất dữ liệu trong quá trình chuyển đổi, tức là khi chuyển đổi từ kiểu có phạm vi thấp hơn sang phạm vi lớn hơn (ví dụ: từ int sang long). Để thực hiện chuyển đổi kiểu ngầm định, không cần thiết phải sử dụng bất kỳ toán tử nào và do đó chuyển đổi đó được gọi là
Tài liệu giảng dạy Th p T nh 1 Trang 44
ẩn. Việc chuyển đổi ngầm định được trình biên dịch thực hiện tự động khi gán một giá trị có phạm vi thấp hơn cho một biến có phạm vi lớn hơn hoặc nếu biểu thức có một số kiểu với các phạm vi khác nhau. Trong trường hợp đó, việc chuyển đổi được thực hiện thành kiểu có phạm vi cao nhất.
Ví dụ:
Kết quả:
Trong ví dụ trên, Num2 đã được chuyển đổi ngầm từ int sang long.
Một số chuyển đổi ngầm định có thể có của các kiểu dữ liệu nguyên thủy trong C #:
sbyte → short, int, long, float, double, decimal;
byte → short, ushort, int, uint, long, ulong, float, double, decimal; short → int, long, float, double, decimal;
Tài liệu giảng dạy Th p T nh 1 Trang 45
char → ushort, int, uint, long, ulong, float, double, decimal ( char là một kiểu ký tự trong một số trường hợp, nó có thể được coi là một số và có các hành vi của số, nó thậm chí có thể tham gia vào các biểu thức số);
uint → long, ulong, float, double, decimal; int → long, float, double, decimal;
long → float, double, decimal; ulong → float, double, decimal; float → double.
Khơng có mất dữ liệu khi chuyển đổi các kiểu phạm vi nhỏ hơn sang các kiểu có phạm vi lớn hơn. Giá trị số vẫn giữ nguyên sau khi chuyển đổi. Có một vài trường hợp ngoại lệ. Khi chuyển đổi kiểu int thành kiểu float (giá trị 32 bit), điểm khác biệt là int sử dụng tất cả các bit cho toàn bộ số, trong khi float có một phần bit được sử dụng để biểu diễn một phần phân số. Do đó, có thể mất độ chính xác là do làm trịn khi chuyển đổi từ int sang float được thực hiện. Điều tương tự cũng áp dụng cho việc chuyển đổi từ long sang
3.3.2.CHUYỂN ĐỔI TƯỜNG MINH
Chuyển đổi kiểu tường minh được sử dụng bất cứ khi nào có khả năng mất dữ liệu. Khi chuyển đổi loại dấu phẩy động sang loại số ngun, ln có sự mất dữ liệu từ việc loại bỏ phần thập phân (ví dụ: double thành long).
Để thực hiện chuyển đổi tường minh, cần phải sử dụng toán tử để chuyển đổi dữ liệu (type).
Có thể xảy ra mất dữ liệu khi chuyển đổi một loại có phạm vi lớn hơn thành loại với loại có phạm vi hẹp hơn (double,long thành int).
Tài liệu giảng dạy Th p T nh 1 Trang 46
Kết quả:
Trong ví dụ trên từ double ép kiểu sang long bị mất giá trị phần thập phân; ép kiểu từ double sang int bị mất giá trị.
Toán tử chuyển đổi kiểu cũng có thể được sử dụng trong trường hợp chuyển đổi ngầm định có chủ ý. Điều này góp phần vào khả năng đọc code, giảm khả năng xảy ra lỗi và nó được coi là thơng lệ tốt.
Thay vì nhận kết quả sai khi tràn dữ liệu khi chuyển từ kiểu lớn hơn sang kiểu nhỏ hơn, để nhận thông báo về vấn đề này sử dụng từ khóa được checked như sau:
Tài liệu giảng dạy Th p T nh 1 Trang 47
Kết quả:
Trong quá trình thực thi đoạn code trên một ngoại lệ (thông báo lỗi) OverflowException được nêu ra.
3.3.3.CHUYỂN ĐỔI THÀNH KIỂU STRING
Có thể chuyển đổi bất kỳ loại dữ liệu nào, bao gồm giá trị null thành chuỗi. Việc chuyển đổi chuỗi được thực hiện bằng các cách sau:
3.3.3.1| Sử dụng toán tử ghép chuỗi “+”
Tài liệu giảng dạy Th p T nh 1 Trang 48
Kết quả:
3.3.3.2| Sử dụng toString:
Tài liệu giảng dạy Th p T nh 1 Trang 49
Kết quả:
3.3.4.CHUYỂN ĐỔI TỪ STRING SANG CÁC KIỂU KHÁC
3.3.4.1| Sử dụng Convert
C# cung cấp các phương thức chuyển kiểu sau:
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 (kiểu integer hoặc string) thành các cấu trúc date-
time
Tài liệu giảng dạy Th p T nh 1 Trang 50
ToDouble Chuyển đổi một kiểu thành một 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
ToString 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 một kiểu unsigned int
ToUInt32 Chuyển đổi một kiểu thành một kiểu unsigned long
ToUInt64 Chuyển đổi một kiểu thành một unsigned big integer
Ví dụ:
Tài liệu giảng dạy Th p T nh 1 Trang 51
3.3.4.2| Sử dụng Parse
Ví dụ:
Kết quả:
Trong trường hợp đối số của Parse là rỗng, không đúng định dạng hoặc vượt quá giá trị cho phép thì sẽ nhận được các Exception tương ứng ví dụ khi chạy chương trình trên, nhập giờ là “an” sẽ phát sinh exception sau
Tài liệu giảng dạy Th p T nh 1 Trang 52
3.3.4.3| Sử dụng TryParse
TryParse là phương thức được tích hợp sẵn trong các lớp kiểu dữ liệu cơ bản của
C#. Cú pháp của TryParse được viết như sau:
TryParse( chuỗi chuyển đổi, out tên biến nhận giá trị); Ví dụ:
Tài liệu giảng dạy Th p T nh 1 Trang 53
Trong trường hợp đối số của TryParse là rỗng, không đúng định dạng hoặc vượt quá giá trị cho phép thì TryPart sẽ trả kết quả false.
Ví dụ nhập giờ là “an” chương trình sẽ cho kết quả sau