【问题标题】:.Net: Empty string is not clear space character?.Net:空字符串是不是清除空格字符?
【发布时间】:2009-04-07 15:10:19
【问题描述】:

我一直使用 String.IsNullOrEmpty 来检查空字符串。最近我注意到一个 " " 算作不是一个空字符串。例如,

 Dim test As String = " "
    If String.IsNullOrEmpty(test) Then
        MessageBox.Show("Empty String")
    Else
        MessageBox.Show("Not Emtpy String")
    End If

它将显示“非空字符串”。那么我们如何检查字符串中的“”或“”呢?

编辑:我不知道 " " 算作字符。

【问题讨论】:

    标签: .net vb.net string null


    【解决方案1】:

    试试这个方法来检查空字符串。它与 Trim() 版本的不同之处在于它不分配新字符串。它还使用了更广泛的空白概念。

    Public Function IsNullOrBlank(ByVal str as String) As Boolean
      if String.IsNullOrEmpty(str) Then
        Return True
      End IF
      For Each c In str
        IF Not Char.IsWhiteSpace(c) Then
          Return False
        End If
      Next
      Return True
    End Function
    

    【讨论】:

    • 哦,您知道使用 Trim 与此相关的成本是多少吗?
    • @Josh 不,这需要分析器:)。我想他们的速度接近于他们做大致相同的事情的速度。主要区别在于字符串的分配
    • Trim() 最坏的情况是将原始字符串中的 n-1 个字符复制到一个新字符串中(如果有一个前导或尾随空格)。充其量它会返回空字符串(如果它已经为空或空白)或原始字符串(如果没有前导或尾随空格)。
    【解决方案2】:

    String.IsNullOrWhiteSpace 在 .NET 4 的 BCL 中

    【讨论】:

      【解决方案3】:

      “”是一个 ASCII 32 值,它与任何其他 ASCII 字符没有什么不同,只是它“看起来”为空白。

      【讨论】:

        【解决方案4】:

        问题是你需要修剪字符串,但是如果你在一个空字符串上调用 trim() 你会得到一个错误。

        string.IsNullOrEmpty(s.Trim())
        

        这会出错。

        你需要做类似的事情

        if (Not string.IsNullOrEmpty(s) AndAlso s.Trim()!=string.Empty)
        

        这将验证字符串不为 null 或为空,如果有内容将修剪然后验证其不为空。

        编辑

        感谢 Slough 帮助我了解我的 VB 语法。我是 C# 人,需要复习一下 vb 的语法

        【讨论】:

          【解决方案5】:

          在 VB.NET 中,您需要使用如下测试:

          If String.IsNullOrEmpty(test) OrElse String.IsNullOrEmpty(test.Trim()) Then
          

          OrElse 防止 NullException 在 test.Trim() 上发生

          【讨论】:

          • 有意思,有没有相当于 OrElse 的 C#?
          • VB 使用 Or 和 OrElse,而 C# 使用 |和||
          • 这比它需要的 null 测试多了一个。更好的做法:If (s Is Nothing OrElse s.Trim() = String.Empty) Then
          • @Martin - 额外的空测试是否值得担心?
          • 不是,但是与检查 Char.IsWhiteSpace() 的每个字符相比,Trim() 可能是一项昂贵的操作。
          【解决方案6】:
          public static bool IsNullOrWhite(string s)
          {
            if (String.IsNullOrEmpty(s))
              return true;
          
            for (int i = 0; i < s.Length; i++)
              if (!Char.IsWhiteSpace(s, i))
                return false;
          
            return true;
          }
          

          【讨论】:

            【解决方案7】:

            如前所述,如果字符串为 null,则调用 Trim() 将引发 NullReferenceException。我有时使用Regex.IsMatch(test, "^ +$")(希望我的参数顺序正确)来测试一个或多个空格。 ^ 和 $ 确保您匹配整个字符串。

            【讨论】:

              【解决方案8】:

              如果您确实需要将仅包含空格字符的字符串视为空字符串或空字符串,那么您可以使用像这样的扩展方法(对不起,它在 C# 中):

              namespace ExtensionMethods
              {
                  public static class StringExtensions
                  {
                      public static bool IsNullOrEmptyOrWhitespace(this string str)
                      {
                          if (string.IsNullOrEmpty(str)) return true;
                          return (str.Trim().Length == 0);
                      }
                  }
              }
              

              这允许你写:

              using ExtensionMethods;
              
              string s1 = "  ";
              string s2 = "some string";
              
              s1.IsNullOrEmptyOrWhitespace(); //-> returns true
              s2.IsNullOrEmptyOrWhitespace(); //-> returns false
              

              【讨论】:

                【解决方案9】:
                If test Is Nothing OrElse test.Trim().Length = 0 Then ...
                

                【讨论】:

                  【解决方案10】:

                  也许您只是想在检查之前修剪(空格)字符串?

                  Dim test As String = " "
                  If test.Trim().Length = 0 Then // Best option as long as string is guaranteed not to be null.
                  //  If test = Nothing OrElse test.Trim().Length = 0 Then // If string can be null.
                      MessageBox.Show("Empty String")
                  Else
                      MessageBox.Show("Not Emtpy String")
                  End If
                  

                  【讨论】:

                  • 另外,请注意您可以测试test.Trim() == string.Empty。这对您个人来说是一个可读性问题(我不认为有任何不同的性能,因为这两项检查都可能得到优化)。
                  • 除了 test 是 null ...对不起 VB.NET 中没有任何东西会崩溃。
                  • @Petar:阅读注释行。 :)
                  【解决方案11】:
                  If String.IsNullOrEmpty(str) OrElse str.Trim().Length = 0 Then
                    ' ..
                  End If
                  

                  如果 str 为 null,则以下内容有时可能不起作用,因为在 null 上调用方法将导致异常。 If String.IsNullOrEmpty(str.Trim()) Then ' 有时异常 ... 结束如果

                  【讨论】:

                    【解决方案12】:

                    您可以添加一个扩展方法,例如在here 中讨论过的方法,并保持与之前IsNullOrEmpty() 相同的易用性。

                    【讨论】:

                    • 叹息...我的答案与下面马丁的答案完全相同。剪切和粘贴获得赞成票,而提供链接获得反对票。一定是使用 Lynx 的人对超链接感到恼火。
                    【解决方案13】:

                    试试

                    Dim test As String = " "
                    If String.IsNullOrEmpty(test.Trim()) Then
                        MessageBox.Show("Empty String")
                    Else
                        MessageBox.Show("Not Emtpy String")
                    End If
                    

                    希望对您有所帮助。

                    【讨论】:

                    • 将在 Trim() 上抛出异常,并且为 null
                    • 是的,我认为这被标记为更高的链条:)
                    猜你喜欢
                    • 2015-03-13
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-05-13
                    • 1970-01-01
                    • 2015-01-13
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多