检查可为空值是否具有值的正确方法

本文关键字:方法 空值 是否 检查 | 更新日期: 2023-09-27 17:55:58

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

.VB:

  1. 如果 v 什么都不是,那么
  2. 如果 v.HasValue 则

C#:

  1. 如果 (v == 空)
  2. if (!v.HasValue)

检查可为空值是否具有值的正确方法

没有区别 - 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() 的调用。

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

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

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

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

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

抱歉,我用 C# 而不是 VB 做了这个示例。

使用 HasValue 属性

If v.HasValue Then
    ...
End