在混合代码项目(VB和C#)中,我们正在调试一些旧的Visual Basic代码,如下所示:
If Request.Params("xxx") <> "" Then
'do something
我认为这是一个错误,因为Request.Params可能是null
,在这种情况下,语句将变为假,这不是主意。
所以我想。我刚刚再次发现 - VB的Nothing
和C#的null
不是一回事, Nothing
与null
不一样。事实上:
if(String.Empty == null) // in C# this is always false (correct)
If String.Empty = Nothing Then ' in VB this is always true (????)
这怎么可能?这是一个向后兼容性问题吗?
答案 0 :(得分:16)
Nothing
在VB中对字符串有特殊含义。要测试字符串引用是否为null,您需要:
If value Is Nothing
来自VB comparison operators documentation:
数字比较将Nothing视为 0.字符串比较将Nothing视为“”(空字符串)。
我怀疑这只是为了向后兼容VB6 - 如果我是VB开发人员的话,这不是我满意的事情。
表格的比较
If value = Nothing
被编译为对Microsoft.VisualBasic.CompilerServices.Operators.CompareString
的调用,如果一个操作数为空而另一个操作数为空,则返回0(即相等)。
答案 1 :(得分:4)
在vb6中,字符串变量的默认值为空字符串。依赖于这种行为的vb6程序员并不比依赖于int变量的默认零初始化的C程序员“更糟糕”;这两种行为都被指定为语言的一部分。
此外,在COM(以前版本的VB6所基于的框架)中,无论何时创建对字符串的引用,都必须手动处理它。由于最常用的字符串是空字符串,因此许多COM方法都明确记录为将空指针视为等效于空字符串。这意味着返回空字符串或将其作为值参数传递或返回一个函数的函数可以简单地传递空指针而不必分配任何内容;然后,空指针的接收者将不必取消分配任何内容。
因为.net中的对象不需要显式释放,所以将空引用作为空字符串的性能优势不再适用。尽管如此,从代码调用的方法可能期望类似于COM方法的行为通常会将空字符串引用视为与空字符串相同。
答案 2 :(得分:1)
你想要
If Not String.IsNullOrEmpty(Request.Params("xxx") Then
...
End If
或者
if (!String.IsNullOrEmpty(Request.Params("xxx")) {
...
}