检查nullable是否有值的正确方法

时间:2011-05-08 07:23:27

标签: c# .net vb.net nullable

假设 v 是可空的,我想知道这些用法之间有什么含义/差异:

VB:

  1. 如果v什么都没有
  2. 如果v.HasValue那么
  3. C#:

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

4 个答案:

答案 0 :(得分:4)

没有区别 - Is Nothing被编译为使用HasValue。例如,这个程序:

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

转换为此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

请注意对get_HasValue()的调用。

答案 1 :(得分:3)

没有区别。你总能得到相同的结果。 前段时间我写了一些单元测试来检查可空类型的不同行为:http://www.copypastecode.com/67786/

答案 2 :(得分:1)

绝对没有区别。这只是你的风格偏好。

这两行代码将生成完全相同的IL代码:

if (!v.HasValue)

if (v == null)

你可以在IL中看到,在这两种情况下都会调用Nullable :: get_HasValue()。

抱歉,我在C#中做过示例,而不是VB。

答案 3 :(得分:0)

使用HasValue属性

If v.HasValue Then
    ...
End