为什么在检查null与VB.NET和C#中的值有什么区别?

前端之家收集整理的这篇文章主要介绍了为什么在检查null与VB.NET和C#中的值有什么区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
VB.NET这发生:
Dim x As System.Nullable(Of Decimal) = Nothing
Dim y As System.Nullable(Of Decimal) = Nothing

y = 5
If x <> y Then
    Console.WriteLine("true")
Else
    Console.WriteLine("false") '' <-- I got this. Why?
End If

但在C#这发生:

decimal? x = default(decimal?);
decimal? y = default(decimal?);

y = 5;
if (x != y)
{
    Debug.WriteLine("true"); // <-- I got this -- I'm with you,C# :)
}
else
{
    Debug.WriteLine("false");
}

为什么有区别?

VB.NET和C#.NET是不同的语言,由不同的团队构建,他们对使用做了不同的假设;在这种情况下是NULL比较的语义。

我个人的偏好是对VB.NET语义,其实质上给NULL语义“我还不知道”。然后比较5对“我还不知道”。自然“我还不知道”;即NULL。这具有镜像sql(在大多数情况下如果不是全部)sql数据库的行为的额外优点。这也是一个更标准的(比C#的)三值逻辑的解释,如解释here

C#团队对NULL意味着什么不同的假设,导致您显示的行为差异。 Per Eric Lippert:“我还写了关于VB / VBScript和JScript herehere中null的语义。

在任何可能存在NULL值的环境中,认识到排除中间的法律(即A或〜A是互为真实的)不再能被依赖是不言而喻的。

更新:

bool(而不是bool?)只能取值TRUE和FALSE。然而,NULL的语言实现必须决定NULL如何通过表达式传播。在VB中,表达式5 = null和5<> null BOTH返回false。在C#中,比较表达式5 == null和5!= null只有第二个[返回false]。但是,在支持null的任何环境中,程序员都有义务知道该语言使用的真值表和null传播。

猜你在找的VB相关文章