Tuy nhiên, trong nhiều trường hợp C# không thể tự thực hiện được mà bạn phải tự mình chỉ định kiểu đích. Loại ép kiểu này được gọi là explicit casting.
Lưu ý, nếu bạn chuyển đổi từ chuỗi “1234” thành số 1234 hay ngược lại, dữ liệu đã bị thay đổi về bản chất. Đây được gọi là type conversion.
Để thực hiện type casting, bạn cần dùng phép toán casting theo cách sau:
(<kiểu-đích) <giá-trị>
Biểu thức này sẽ thực hiện chuyển đổi <giá-trị> sang <kiểu-đích>. Nếu quá trình ép kiểu không thành công, biểu thức sẽ phát ra ngoại lệ (exception).
Ví dụ sau đây sẽ ép kiểu của biến o1 (kiểu object) sang kiểu string và gán vào biến str1:
> object o1 = "Hello world";
> string str1 = (string)o1;
> str1
"Hello world"
Type casting với phép toán as
Một cách khác để thực hiện ép kiểu là sử dụng phép toán as
. Phép toán as
thực hiện ép kiểu cho giá trị. Nếu không thành công sẽ trả về giá trị null. Phép toán này an toàn hơn so với sử dụng phép toán ép kiểu trực tiếp ở trên do nó tránh được exception khi ép kiểu không thành công.
> object o1 = "Hello world";
> string str2 = o1 as string;
> str2
"Hello world"
> object o2 = 12345;
> string str3 = o2 as string;
> str3
null
>
Tuy nhiên, phép toán as lại chỉ có thể áp dụng được đối với các kiểu tham chiếu (reference type). Nó không áp dụng được với kiểu giá trị (value type). Lý do là vì trong trường hợp ép kiểu không thành công, nó trả về giá trị null
. Đây là giá trị đặc trưng riêng của kiểu tham chiếu (và kiểu nullable).
Kiểm tra kiểu – phép toán is
Để đảm bảo không gây lỗi khi ép kiểu, bạn nên kiểm tra kiểu (type checking) trước khi thực hiện.
C# sử dụng phép toán is
để kiểm tra kiểu của một giá trị (object). Hãy thực hiện một vài ví dụ trên C# interactive:
> object o1 = "Hello world";
> o1 is string
true
> o1 is int
false
Phép toán is
nhận một giá trị ở bên trái và tên kiểu ở bên phải. Nó trả về giá trị true nếu giá trị thuộc về kiểu đó. Trong ví dụ trên, giá trị của o1 thuộc kiểu string nên biểu thức o1 is string
trả về giá trị true
, còn o1 is int
trả về giá trị false
.
Lấy thông tin về kiểu: phép toán typeof
Phép toán typeof trả về một object chứa thông tin về kiểu dữ liệu. Từ kết quả này bạn có thể lấy tất cả các thông tin cần thiết về chính kiểu dữ liệu. Ví dụ:
> Type stringType = typeof(string);
> stringType
[System.String]
> stringType.UnderlyingSystemType
[System.String]
> stringType.Assembly
[mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]
> stringType.BaseType
[System.Object]
> stringType.FullName
"System.String"
Lưu ý rằng, typeof chỉ nhận tham số là tên kiểu dữ liệu. Nếu muốn lấy thông tin về kiểu từ biến, bạn phải dùng phương thức GetType():
// Lưu ý: nếu bạn muốn lấy thông tin về kiểu dữ liệu từ biến, bạn phải dùng phương thức GetType()
> stringType = "Hello world".GetType();
// hai phương pháp này cho cùng một kết quả
Phép toán typeof được sử dụng rất nhiều cùng với lập trình dynamic, generic và reflection.
Kết luận
Trong bài học này bạn đã tiếp xúc với các phép toán (toán tử) cơ bản của C#. Rất dễ nhận thấy rằng, các toán tử này hoàn toàn tương tự như trong các ngôn ngữ kế thừa cú pháp của ngôn ngữ C.
Nếu bạn có xuất phát điểm là một trong những ngôn ngữ này, việc nắm bắt các toán tử cơ bản của C# rất đơn giản. Ngay cả khi bạn xuất phát từ một ngôn ngữ khác, các phép toán cơ bản của C# không có gì phức tạp. Các vấn đề cần lưu ý đã được trình bày trong bài.