检查可为空值是否具有值的正确方法
本文关键字:方法 空值 是否 检查 | 更新日期: 2023-09-27 17:55:58
假设v是可为空的,我想知道这些用法之间有什么含义/区别:
.VB:
- 如果 v 什么都不是,那么
- 如果 v.HasValue 则
C#:
- 如果 (v == 空)
- 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