правильный способ проверить, имеет ли значение nullable значение - PullRequest
4 голосов
/ 08 мая 2011

при условии, что v является обнуляемым, мне интересно, каковы последствия / различия между этими использованиями:

VB:

  1. Если v - ничто, тогда
  2. Если v.HasValue, то

C #:

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

Ответы [ 4 ]

4 голосов
/ 08 мая 2011

Нет никакой разницы - 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().

3 голосов
/ 08 мая 2011

Разницы нет.Вы всегда получаете один и тот же результат.Некоторое время назад я написал несколько модульных тестов, которые проверяют различное поведение обнуляемых типов: http://www.copypastecode.com/67786/.

1 голос
/ 08 мая 2011

Абсолютно без разницы.Это просто ваш стиль.

Эти две строки кода будут генерировать абсолютно идентичный код IL:

if (!v.HasValue)

if (v == null)

В IL видно, что в обоих случаях Nullable :: get_HasValue ()звонил.

Извините, я сделал сэмпл в C #, а не в VB.

0 голосов
/ 08 мая 2011

Используйте свойство HasValue

If v.HasValue Then
    ...
End
...