Star date: 2009.106
VB.NET has the sometimes useful feature of late binding, but this seems to lead to poor code. By default, late binding is enabled (ie: Option Strict
is set to Off
) allowing for implicit narrowing conversions (no cast). Although there are certainly cases where this is a useful feature that can cut down on the amount of reflection code left up to the programmer, I have found that it is more often a cause of less robust code and needless performance degradation.
With Option Strict Off
we can write code like this:
Dim obj As Object = "Hello, World!"
Dim str As String = obj
In this case the code will run just fine, and it saved us the hassle of casting obj
to String
. However, we will obviously run into problems in a situation like this:
Dim obj As Object = "Hello, World!"
Dim int As Integer = obj
Even though int
is an Integer
this code will compile, but at runtime there will be an InvalidCastException
. This is all pretty simple stuff, but the bottom line is that in this case, Option Strict Off
gives a runtime error, while Option Strict On
gives a compile error. The value of compile-time errors should not be taken lightly, and in my humble opinion they are a programmer's best friend. With Option Strict On
our first sample only needs a minor change:
Dim obj As Object = "Hello, World!"
Dim str As String = DirectCast(obj, String)
Was it really that difficult just to cast it? Type casting is not an inconvenience, but a necessary precaution requiring the programmer to say to the compiler: "Yes, I did intend to perform a narrowing conversion. It was not an accident".
As a general rule of thumb, I like to set Option Strict On
as the project default (go to Project -> Properties -> Compile) and then add Option Strict Off
to code files that require it rather than the other way around.