IsNothing? Definitely!
While reviewing some existing code at my new job I noticed that they use the VB.NET IsNothing() function instead of using the "Is Nothing" syntax. I didn't even know there was an "IsNothing" function so I compiled some code and checked it out with ILDASM. Here's what I compiled:
Public Sub Foo2() Dim o As AppDomain If IsNothing(O) Then Debugger.Break() End If End Sub
At the resulting IL is:
.method public instance void Foo2() cil managed { // Code size 18 (0x12) .maxstack 1 .locals init ([0] class [mscorlib]System.AppDomain o) IL_0000: nop IL_0001: ldloc.0 IL_0002: call bool [Microsoft.VisualBasic]Microsoft.VisualBasic.Information::IsNothing(object) IL_0007: brfalse.s IL_000f IL_0009: call void [mscorlib]System.Diagnostics.Debugger::Break() IL_000e: nop IL_000f: nop IL_0010: nop IL_0011: ret } // end of method Module1::Foo2
Ahhh... There's a call to the VisualBasic library. Let's see what Information.IsNothing does:
.method public static bool IsNothing(object Expression) cil managed { // Code size 5 (0x5) .maxstack 2 .locals init (bool V_0) IL_0000: ldarg.0 IL_0001: ldnull IL_0002: ceq IL_0004: ret } // end of method Information::IsNothing
If your IL is a little rusty, allow me to translate it for you into VB.NET:
Public Shared Function IsNothing(ByVal Expression As Object) As Boolean Return (Expression Is Nothing) End Function
Yup! A call to IsNothing() isn't inlined into a simple check for null. It's a function call. That will check for null. I was baffled when I found this. Why spend time developing such a method? Since this is Microsoft I assume there were functional designs, technical designs, code reviews, peer reviews, unit tests, etc... Just for a one-line function that could have very easily been inlined by the VB.NET compiler. I always assume when something seems so obviously wrong there must be something I'm missing...