Trong bài viết này chúng ta sẽ cùng tìm hiểu về sự khác nhau của 3 toán tử DirectCast, toán tử TryCast và hàm CType:
1. Toán tử DirectCast
#1. Đặc điểm:
– Là toán tử chuyển đổi kiểu dữ liệu dựa trên inheritance hoặc implementation.
– Sử dụng toán tử DirectCast khi 2 kiểu dữ liệu chuyển đổi có quan hệ với nhau.
( Kiểu dữ liệu được chuyển đổi phải implement hoặc inherit từ kiểu dữ liệu muốn chuyển đổi)
– Khi chuyển đổi bị lỗi sẽ throw ra exception: System.InvalidCastException
.
#2. Cú pháp:
Dim <tenBien2> As <KieuDuLieu2> = DirectCast( <tenBien_Of_KieuDuLieu1>, <KieuDuLieu2> )
<KieuDuLieu1> MUST based on inheritance or implementation <KieuDuLieu2>
( <KieuDuLieu1> cần phải là CON của <KieuDuLieu2> (CHA) mới dùng toán tử DirectCast )
#3. Ví dụ:
Dim obj As Object = DirectCast(intNum, Object)
[/code]
#4. Demo:
Sub Main()
‘ ■ Với câu lệnh bên dưới khi complier thì OK, nhưng sẽ có lỗi lúc run time,
‘ sẽ throw ra Exception: System.InvalidCastException.
‘ Vì biến [obj1] có kiểu dữ liệu là [Object] tức là CHA của kiểu Integer,
‘ nên KHÔNG DÙNG toán tử [DirectCast] để cast được.
‘Dim obj1 As Object = 2.37
‘Dim intNum As Integer = DirectCast(obj1, Integer)
‘ ■ Còn trường hợp như bên dưới thì OK,
‘ vì kiểu Single được dẫn xuất từ kiểu Object.
Dim fFloat As Single = 6.9
Dim obj2 As Object = DirectCast(fFloat, Object)
‘ Hoặc:
‘Dim obj3 As Object = fFloat
Console.WriteLine(obj2) ‘ Output: obj2 = 6.9
‘ ■ Hay 1 ví dụ khác như bên dưới cũng xảy ra lỗi, throw exception: System.InvalidCastException.
‘ Biến[eventType] có kiểu Object KHÔNG implement hay inherit từ kiểu dữ liệu [ClassEvents]
‘Dim eventType As Object = Nothing
‘If TypeOf eventType Is ClassEvents Then
‘ m_selectEvents = DirectCast(eventType, ClassEvents)
‘End If
‘ ■ Hay sử dụng như bên dưới là OK, vì [Form] Inherits [Control]
Dim f As New System.Windows.Forms.Form
Dim c As System.Windows.Forms.Control
c = DirectCast(f, System.Windows.Forms.Control)
Console.ReadKey()
End Sub
End Module
[/code]
2. Hàm CType
– Trả lại kết quả của việc chuyển đổi tường minh(explicitly converting) một biểu thức sang một kiểu dữ liệu cụ thể, kiểu object, structure, class, hay interface.
– Cách thức hoạt động giống như Convert.To___() trong C#, trong đó ___ là kiểu dữ liệu đích muốn cast. (Xem bài viết Các cách chuyển đổi kiểu dữ liệu trong C#)
– Sử dụng hàm CType thì 2 kiểu dữ liệu chuyển đổi có/không có quan hệ với nhau đều dùng được.
– Khi chuyển đổi bị lỗi sẽ throw ra exception: System.InvalidCastException
.
■ VB.Net:
Sub Main()
Dim d As Single = 3.5
Dim i As Integer = CType(d, Integer) ’ Set to 4 (Banker’s rounding)
‘ Output: i = 4
i = CInt(d) ’ Same result as CType
‘ Output: i = 4
i = Int(d) ‘ Set to 3 (Int function truncates the decimal)
‘ Output: i = 3
Console.ReadKey()
End Sub
End Module
[/code]
■ C#:
float d = 3.5f; i = Convert.ToInt32(d); // Set to 4 (rounds) int i = (int)d; // set to 3 (truncates decimal)
3. Toán tử TryCast
– Là toán tử “safe cast” chuyển đổi kiểu dữ liệu mà không throw an exception khi chuyển đổi bị lỗi. Còn toán tử DirectCast và hàm CType khi cast lỗi đều throw exception InvalidCastException.
– Khi chuyển đổi bị lỗi, kết quả sẽ trả về là Nothing, do đó mà chúng ta không cần phải handle lỗi, chỉ cần kiểm tra kết quả trả về có phải là Nothing hay không rồi tiếp tục xử lý logic khác,…
– Toán tử TryCast hoạt động giống như toán tử as trong C#
VB.Net: Dim c As Circle = TryCast(shape, Circle) ' Returns Nothing if type cast fails C#: Circle c = shape as Circle; // Returns null if type cast fails