代码之家  ›  专栏  ›  技术社区  ›  Abel

什么都不等于字符串。空的,空的不等于字符串。空的,我缺少什么?

  •  10
  • Abel  · 技术社区  · 15 年前

    在一个混合代码项目(VB和C)中,我们调试了一些旧的Visual Basic代码,如下所示:

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

    我认为这是一个错误的要求。参数可能是 null ,在这种情况下,声明会变成假的,这不是我的想法。

    Nothing 和C# 无效的 不一样的东西 没有什么 无效的 . 事实上:

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

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

    3 回复  |  直到 8 年前
        1
  •  16
  •   Jon Skeet    15 年前

    Nothing 在VB中对字符串有特殊的意义。要测试字符串引用是否为空,需要:

    If value Is Nothing
    

    VB comparison operators documentation :

    0。字符串比较不将任何内容视为“”(空字符串)。

    我怀疑这只是为了与VB6的向后兼容性-如果我是一个VB开发人员的话,我不会对它感到满意。

    If value = Nothing
    

    编译为调用 Microsoft.VisualBasic.CompilerServices.Operators.CompareString 如果一个操作数为空,另一个为空,则返回0(即等于)。

        2
  •  4
  •   supercat    14 年前

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

    此外,在COM(VB6以前版本所基于的框架)中,任何时候创建对字符串的引用时,都必须有人手动处理它。由于最常用的字符串是空字符串,许多COM方法都被显式地记录为将空指针等效于空字符串。这意味着一个函数返回一个空字符串或传递一个作为值参数或返回一个可以简单地传递一个空指针,而不必分配任何东西;空指针的接收者将不必取消分配任何内容。

        3
  •  1
  •   Matt Mitchell    15 年前

    你想要什么

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

    或者

    if (!String.IsNullOrEmpty(Request.Params("xxx")) {
        ...
    }