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.
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
String. However, we will obviously run into problems in a situation like this:
Dim obj As Object = "Hello, World!" Dim int As Integer = obj
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.