The correct way to check if nullable is

Assuming v is null, I'm wondering what are the consequences / differences between these usages:

VB:

  • If v is nothing
  • If v. HasValue Then

WITH#:

  • if (v == null)
  • if (! v. HasValue)
+4
source share
4 answers

It HasValue no difference - Is Nothing compiled to use HasValue . For example, this program:

 Public Class Test Public Shared Sub Main() Dim x As Nullable(Of Integer) = Nothing Console.WriteLine(x Is Nothing) End Sub End Class 

translates to this IL:

 .method public static void Main() cil managed { .entrypoint .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) // Code size 24 (0x18) .maxstack 2 .locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0) IL_0000: ldloca.s V_0 IL_0002: initobj valuetype [mscorlib]System.Nullable`1<int32> IL_0008: ldloca.s V_0 IL_000a: call instance bool valuetype [mscorlib]System.Nullable`1<int32>::get_HasValue() IL_000f: ldc.i4.0 IL_0010: ceq IL_0012: call void [mscorlib]System.Console::WriteLine(bool) IL_0017: ret } // end of method Test::Main 

Pay attention to the get_HasValue() call.

+4
source

There is no difference. You always get the same result. Some time ago, I wrote several unit tests that test different types of types with null types: http://www.copypastecode.com/67786/ .

+3
source

Absolutely no difference. This is just your style of preference.

These two lines of code generate exactly the same IL code:

 if (!v.HasValue) if (v == null) 

You can see in IL that in both cases Nullable :: get_HasValue () is called.

Sorry, I made a sample in C #, not in VB.

+1
source

Use the HasValue

 If v.HasValue Then ... End 
0
source

All Articles