Pages

Friday, September 19, 2008

Difference Between DirectCast and TryCast

Generally while doing our program in VB.NET or any language whatsoever, we come across some situation where we are in Dilemma of having more than one solution of a single problem. We think thoroughly of our knowledge base, search the Internet to get which one will be the best logic discuss with seniors or otherwise do random choice or anything. As a programmer, I always do face the problem. Let us take the example of casting in .NET.

We know, VB.NET always include Microsoft VisualBasic Namespace for your application internally, and you cannot remove the reference to that or even you don't find the namespace in the References list. This is because while you do programming with Visual Basic, your application would be enriched with some of the functionalities that Microsoft VisualBasic namespace have within your program. Take for instance Val, CStr, CInt etc. All of them are written inside Microsoft VisualBasic namespace and is included automatically in our program. They are are acting as language helpers in your program.

DirectCast:

Let us try to write one of this language helpers ourself.

Public Function CustomCInt(ByVal value as Object) as Integer
if typeof Value is Integer then
Dim i as Integer = CustomCInt(Value)
Return i
End Function

After viewing the above code you must be laughing like hell on what I have done with this. Actually my motive is to show you how difficult is to write a helper yourself without using CLR supported casting feature. Here comes the case of DirectCast. While using CInt, CStr, or CType you are actually calling a function which does similar to what I have written. Means it first checks if the type is convertable or not through Typeof Operator and then casts to appropriate Type.
DirectCast is the Simple CLR typecasting feature which you can use when you are sure about the cast. It avoids the sequence of checking in the helper Functions. Now you can write your own Helper Function like this:

Public Function CustomCInt(ByVal value as Object) as Integer
If TypeOf value is Integer then
Dim i as Integer = DirectCast(value,Integer)
Return i
End if
End Function

Now it looks great, Isnt it. Actually this is how .NET helpers are made, CType checks if the object corresponds to the Type specified and then DirectCast it to return the Converted Type Data. DirectCast is the most simple and CLR supported TypeCast feature that will cast properly if it is with appropriate type or otherwise throws an error.

TryCast:

Now going further, Lets start with TryCast. After knowing DirectCast you may wonder what exactly the TryCast is. Actually TryCast operator of VisualBasic is equivalent to 'is' operator of C#. TryCast is useful in some situations too.
Let us take the following example

Public Function CustomCheck(ByVal value as Object) as IDBConnection
If TypeOf value is IDBConnection then
Dim i as IDBConnection = DirectCast(value,IDBConnection)
Return i
End if
End Function

In this example, we are telling the CLR to check the type of Value that we passed to the Function using TypeOf function in the If statement. If it enters into the IF we can confirm that the value implements IDBConnection. But CLR doesn't knows it. Thus on the very next step, it will check if the value actually an implementation of IDBConnection again. Thus we are running redundant code. Using TryCast we can avoid that.
We may write

Dim i as IDBConnection = TryCast(value,IDBConnection)


This will direct the CLR to check if value implements IDBConnection and if so, it will convert it directly. Thus we removed Redundant code.
TryCast will store nothing if it cannot cast the value. In case of using TryCast for primitive types, it will store the value of initialization as output if it cannot convert. For Instance, conversion to integer will give you Zero(0) etc.

Hope you understand the two simple operators of Visual Basic. Don't forget to Comment on the topic. Thanks.