Lập trình VB.Net

Sự khác nhau của CType, DirectCast, TryCast là gì ?

Sự khác nhau của CType, DirectCast, TryCast là gì?
Được viết bởi Minh Hoàng

Series lập trình VB.NET, ngôn ngữ lập trình hướng đối tượng .NET Framework

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
  2. Hàm CType
  3. Toán tử TryCast
1. Toán tử DirectCast
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ụ:

[code language=”vb”] Dim intNum As Integer = 10
Dim obj As Object = DirectCast(intNum, Object)
[/code]

#4. Demo:

[code language=”vb” highlight=”15,34″] Module MinhHoangBlog

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

[code language=”vb” highlight=”7″] Module MinhHoangBlog

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
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
Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

Translate »