在混合代码项目(VB和C#)中,我们正在调试一些旧的视觉基本代码:

If Request.Params("xxx") <> "" Then
   'do something

我认为这是一个错误,因为params可能是 null, ,在这种情况下,陈述将变成错误,这不是想法。

所以我认为。我刚刚发现 - 又是 - 那个VB Nothing 和C# null 不是一样的东西 Nothingnull. 。实际上:

if(String.Empty == null)          // in C# this is always false (correct)
If String.Empty = Nothing Then    ' in VB this is always true (????)

这怎么可能?这是一些向后兼容性问题吗?

有帮助吗?

解决方案

Nothing 在VB中具有特殊含义的字符串。要测试字符串参考是否为null,您需要:

If value Is Nothing

来自 VB比较操作员文档:

数字比较无视。

我怀疑这只是与VB6的向后兼容性 - 如果我是VB开发人员,那不是我很高兴的事情。

形式的比较

If value = Nothing

被编译为打电话 Microsoft.VisualBasic.CompilerServices.Operators.CompareString 如果一个操作数为null,另一个是空的,则返回0(IE等)。

其他提示

在VB6中,字符串变量的默认值是一个空字符串。依靠这种行为的VB6程序员不会比依赖于int变量的默认零初始化的C程序员“更糟糕”。两种行为均指定为语言的一部分。

此外,在COM(以前版本的VB6所基于的框架)中,每当创建对字符串的引用时,就必须手动处理它。由于最常用的字符串是空字符串,因此许多COM方法被明确记录在无效指针上等同于空字符串。这意味着返回空字符串或将其作为值参数传递的函数或返回一个函数可以简单地传递空指针而无需分配任何内容。然后,无效指针的收件人将不必分配任何东西。

由于.NET中的对象不需要明确的交易,因此无效引用的性能优势不再应用为空字符串。尽管如此,从代码中调用的方法可能期望的行为类似于com方法的行为,通常将null字符串引用与空字符串相同。

你要

If Not String.IsNullOrEmpty(Request.Params("xxx") Then
    ...
End If

或者

if (!String.IsNullOrEmpty(Request.Params("xxx")) {
    ...
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top