[英]Nothing equals String.Empty, null does not equal String.Empty, what am I missing here?
在混合代码项目(VB和C#)中,我们正在调试一些旧的Visual Basic代码,如下所示:
If Request.Params("xxx") <> "" Then
'do something
我认为这是一个错误,因为Request.Params可能为null
,在这种情况下,语句将变为false,这不是主意。
所以我认为。 我刚刚发现 - 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 (????)
这怎么可能呢? 这是一些向后兼容问题吗?
VB中的字符串Nothing
特殊含义。 要测试字符串引用是否为null,您需要:
If value Is Nothing
从VB比较运算符文档 :
数值比较将Nothing视为0.字符串比较将Nothing视为“”(空字符串)。
我怀疑这只是为了向后兼容VB6 - 如果我是VB开发人员的话,这不是我会满意的。
形式的比较
If value = Nothing
被编译为对Microsoft.VisualBasic.CompilerServices.Operators.CompareString
的调用,如果一个操作数为空而另一个操作数为空,则返回0(即相等)。
在vb6中,字符串变量的默认值是空字符串。 依赖于这种行为的vb6程序员并不比依赖于int变量的默认零初始化的C程序员“更糟糕”; 这两种行为都被指定为语言的一部分。
此外,在COM(VB6的早期版本所基于的框架)中,每当创建对字符串的引用时,某人将不得不手动处理它。 由于最常用的字符串是空字符串,因此许多COM方法都明确记录为将空指针视为等效于空字符串。 这意味着返回空字符串或将其作为值参数传递或返回一个函数的函数可以简单地传递空指针而不必分配任何内容; 然后,空指针的接收者将不必取消分配任何内容。
因为.net中的对象不需要显式释放,所以将空引用作为空字符串的性能优势不再适用。 尽管如此,从代码中调用可能期望类似于COM方法的行为的方法通常会将空字符串引用视为与空字符串相同。
你要
If Not String.IsNullOrEmpty(Request.Params("xxx") Then
...
End If
要么
if (!String.IsNullOrEmpty(Request.Params("xxx")) {
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.