【问题标题】:IsNullOrEmptyOrWhiteSpace method missing缺少 IsNullOrEmptyOrWhiteSpace 方法
【发布时间】:2010-07-04 08:19:08
【问题描述】:

我定义了一个字符串并通过string.IsNullOrEmptyOrWhiteSpace()检查它。

但是我收到了这个错误:

'string' 不包含'IsNullOrEmptyOrWhiteSpace' 的定义,并且找不到接受'string' 类型的第一个参数的扩展方法'IsNullOrEmptyOrWhiteSpace'(您是否缺少 using 指令或程序集引用?) D​​:\ project\project\Controllers\aController.cs 23 24 项目

是什么原因?

【问题讨论】:

  • @4thpage:没有“csharp”之类的东西。它是“C#”。
  • 如果你使用 VS2010 很容易将目标框架切换到 4.0 并且像魔术一样错误会消失
  • @John Saunders:如果它看起来像 csharp,闻起来像 csharp,拼写像 csharp,那一定是 csharp。
  • @AMi 没有 csharp、c-sharp、c_# 或 cshizzarp 标签。有一个 c# 标签,你可以用它来标记一个 c# 问题。
  • 您正在寻找未定义的函数。 string (System.String) 仅包含 IsNullOrEmpty 或 IsNullOrWhitespace 的定义,不包含 IsNullOrEmptyOrWhitespace。如果字符串为空,string.IsNullOrWhitespace 将返回 true。此外,这是一个关于 .NET 框架的问题,并不特定于 c#。

标签: c# .net


【解决方案1】:

String.IsNullOrWhiteSpace 已在 .NET 4 中引入。如果您的目标不是 .NET 4,您可以轻松编写自己的:

public static class StringExtensions
{
    public static bool IsNullOrWhiteSpace(string value)
    {
        if (value != null)
        {
            for (int i = 0; i < value.Length; i++)
            {
                if (!char.IsWhiteSpace(value[i]))
                {
                    return false;
                }
            }
        }
        return true;
    }
}

可以这样使用:

bool isNullOrWhiteSpace = StringExtensions.IsNullOrWhiteSpace("foo bar");

如果您愿意,也可以使用extension method

public static class StringExtensions
{
    public static bool IsNullOrWhiteSpace(this string value)
    {
        if (value != null)
        {
            for (int i = 0; i < value.Length; i++)
            {
                if (!char.IsWhiteSpace(value[i]))
                {
                    return false;
                }
            }
        }
        return true;
    }
}

允许您直接使用它:

bool isNullOrWhiteSpace = "foo bar".IsNullOrWhiteSpace();

要使扩展方法正常工作,请确保已定义 StringExtensions 静态类的命名空间在范围内。

【讨论】:

  • @Darin,你说得对,该方法仅在 .NET 4 .0 和 .NET Client Profile 4.0 中启用
  • 请教一个问题,为什么使用内部 for 循环而不是 value.trim()!=string.empty ?
  • @Jon,这样你就不用创建一个新的字符串了,只要找到第一个非空白字符就可以返回false(Trim会看开头的字符and 结束,直到找到非空白)。 TrimStart 不会那么糟糕,但您仍在不必要地创建一个新的(可能很长)字符串。
  • @KMan,如果扩展的this 参数为空,允许扩展方法正常运行被认为是不好的做法。在这种情况下,在您的扩展方法中不抛出 ArgumentNullException 与其他对象引用的行为不一致。这是根据 Microsoft 的建议。
  • @uosɐſ 我想这是一个不应该抛出异常的例外情况))
【解决方案2】:

这是另一种替代实现,只是为了好玩。它的性能可能不如 Darin,但它是 LINQ 的一个很好的例子:

public static class StringExtensions
{
    public static bool IsNullOrWhiteSpace(this string value)
    {
        return value == null || value.All(char.IsWhiteSpace);
    }
}

【讨论】:

  • 因为.All() 也会在值为空时返回 true,这可能正是 OP 正在寻找的。​​span>
【解决方案3】:

也许IsNullOrWhiteSpace 是您正在寻找的方法? http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace.aspx

【讨论】:

    【解决方案4】:

    我用过(在 .NET v2.0 中):

    public static class StringExtensions
    {
        public static bool IsNullOrEmptyOrWhitespace(this string value)
        {
            return string.IsNullOrEmpty(value) || string.IsNullOrEmpty(value.Trim());
        }
    }
    

    Trim() 方法将删除所有前导或尾随空格,因此如果您的字符串完全是空格,它将被缩减为空字符串。

    我不能说性能一直是个问题。

    【讨论】:

    • >>我用过(在.NET v2.0中):NET3.5中引入的扩展方法,如何在NET2.0中使用?
    • 最初,在 VS2005 中,这是一个实用方法(从第一个参数中删除 'this')。后来我们转移到 VS2008,同时仍然以 .net2.0 为目标,并使用以下方法捏造了扩展方法(这是编译器功能,不是 .NET Framework 功能)的使用:geekswithblogs.net/robp/archive/2007/12/20/…。现在我们在 .NET 3.5 上,所以我们失去了软糖。
    • 这不会产生垃圾和分配吗? Trim() 将生成一个新字符串,因为字符串是不可变的。为这样一个简单的操作触发分配是一种浪费。应尽可能避免字符串操作。
    【解决方案5】:

    来自 Microsoft 的 .NET 4 Framework 源代码的精确副本,..\RefSrc\Source.Net\4.0\DEVDIV_TFS\Dev10\Releases\RTMRel\ndp\clr\src\BCL\System\String.cs\1305376\字符串.cs

        public static bool IsNullOrEmpty(String value) {
            return (value == null || value.Length == 0); 
        }
    
        public static bool IsNullOrWhiteSpace(String value) {
            if (value == null) return true; 
    
            for(int i = 0; i < value.Length; i++) { 
                if(!Char.IsWhiteSpace(value[i])) return false; 
            }
    
            return true;
        }
    

    备注

    (来自http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace.aspx

    IsNullOrWhiteSpace 是一种方便的方法,类似于以下代码,不同之处在于它提供了卓越的性能:

    return String.IsNullOrEmpty(value) || value.Trim().Length == 0;
    

    空白字符由 Unicode 标准定义。 IsNullOrWhiteSpace 方法将任何在传递给 Char.IsWhiteSpace 方法时返回值为 true 的字符解释为空白字符。

    【讨论】:

      【解决方案6】:

      有趣的是,这里没有人使用 Trim 功能:

      public static class StringExtensions
      {
          public static bool IsNullOrEmptyOrWhiteSpace(this string value)
          {
              return string.IsNullOrEmpty(value) ||
                     ReferenceEquals(value, null) ||
                     string.IsNullOrEmpty(value.Trim(' '));
          }
      }
      

      更新:我现在在 cmets 中看到,由于各种原因,它被提议和拒绝,但如果有人更喜欢简洁而不是效率……

      【讨论】:

      • 怎么比我的版本更简洁?我还建议使用 ||比在这里使用条件运算符更具可读性。
      • @Jon,不是。我会克制自己不要在周日在 SO 上发帖 :)
      • 写一些简单逻辑的方式多么复杂!我很想给它-1,但这不是“错误”,只是不容易阅读。
      • “if”语句呢?
      【解决方案7】:

      Pre .NET 4.0,最短:

      public static bool IsNullOrWhiteSpace(this string value)
      {
          return value == null || value.Trim() == "";
      }
      

      效率不高;考虑到可读性和性能,Jon 的更好。

      【讨论】:

      • 请注意,.Trim() 会创建一个必须进行垃圾回收的额外字符串,而 for/Char.IsWhiteSpace 解决方案则不会。
      • @HansKesting 是的,而且 Trim() 需要比 for/All.Char.IsWhiteSpace 更多地遍历字符串,因为在后者中,执行在第一个非空白字符之后停止。正如我在答案中所说,它效率不高,但对于 90% 的情况来说,这无关紧要。给出了我能想到的最简洁的答案。 Jon 的答案确实是我在这里找到的最好的答案。
      猜你喜欢
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      相关资源
      最近更新 更多