Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#String.IsNullOrEmpty:好还是坏?_C#_Isnullorempty - Fatal编程技术网

C#String.IsNullOrEmpty:好还是坏?

C#String.IsNullOrEmpty:好还是坏?,c#,isnullorempty,C#,Isnullorempty,在工作中,我将String.IsNullOrEmpty与会话变量一起误用后,我的一位同事现在拒绝接受我使用String.IsNullOrEmpty。经过一些研究,很明显,MSDN()上列出了IsNullOrEmpty的一个bug(请阅读底部的注释): 截至2006年4月4日,存在一个bug (在JIT中可能)这使得 方法在优化失败时失败 打开了。众所周知,它对这两方面都有影响 C#和VB 更多信息可在此处找到()。微软的错误“应该”在奥卡斯之后修复了,但不幸的是,我的雇主仍然使用VS2005。但

在工作中,我将String.IsNullOrEmpty与会话变量一起误用后,我的一位同事现在拒绝接受我使用String.IsNullOrEmpty。经过一些研究,很明显,MSDN()上列出了IsNullOrEmpty的一个bug(请阅读底部的注释):

截至2006年4月4日,存在一个bug (在JIT中可能)这使得 方法在优化失败时失败 打开了。众所周知,它对这两方面都有影响 C#和VB

更多信息可在此处找到()。微软的错误“应该”在奥卡斯之后修复了,但不幸的是,我的雇主仍然使用VS2005。但如果这个问题在2008年得到解决,那就这样吧。对我来说没关系

虽然我的同事拒绝使用IsNullOrEmpty对我来说是盲目无知(IMO),但他肯定不能告诉我为什么不使用它,除了对session变量的误用。我在我们的代码中使用了IsNullOrEmpty,没有任何问题。就我个人而言,除了在一个声明中做两件事之外,我觉得它更具可读性

在谷歌搜索了关于这个问题的意见后,我找到了持赞成/反对立场的网站。以下是我读过的一些网站:

一个站点()很好地总结了该方法(IMHO):

在这里,我们看到它是空的 方法,该字符串类型 为我们提供了一个比较好的 一种有效的检查 字符串可以保存或使用。然而, 对于性能,最好是 使用手动空值检查。空字符串 也可以通过其他方式进行测试,以及 我在这里的研究表明 长度最快


假设在VS2008/2010/etc中修复了bug(并且工作正常),那么有什么理由不在VS2005及以后的版本中使用String.IsNullOrEmpty吗?我意识到这对于这样一个愚蠢的小方法来说似乎有些过分,但我想知道是否有更多的幕后活动,是否有人有其他解释。

这个问题在.NET 2.0 sp1中得到了修复。现在没有理由不使用它


如果您使用的是.NET 2,那么出于许多其他原因,您应该使用sp1-我认为没有理由因为一个不再存在的错误而避免使用sp1。

如果在您的版本中它被破坏,那么只使用一个静态方法来进行检查是很简单的,所以只需执行以下操作:

public static bool isNull(String s) {
  return s == null || s.trim().length == 0;
}
在一些相对容易解决的问题上卷入大问题毫无意义


您不需要到处更改它,尽管您可以用一个静态方法替换另一个静态方法。

您可以编写一个通过空字符串和一个通过空字符串的单元测试来测试这些内容,并在VS2005和2008年之后运行它,在您包含的链接中查看错误报告中发生了什么

此错误已在Microsoft.NET Framework 2.0 Service Pack 1(SP1)中修复

既然如此,只要安装了.NET2的SP1,那么使用VS2005就不重要了


至于是否使用它,请查看此

我很确定它是在SP1上修复的,但无论如何,你可以创建自己的null或空方法:)

与任何语言或其中的任何部分一样,这都是关于了解优点/缺点,并根据这些信息做出明智的决定。IMHO.

我们对
字符串使用扩展方法。IsNullOrEmpty

public static bool IsNullOrEmpty(this string target)
{
  return string.IsNullOrEmpty(target);
}
使用这种方法,即使它在以前的版本中被破坏,错误修复也只是一行代码

以及能够在可能为null的字符串实例上使用该方法的附加实用程序:

string myString = null;
if (myString.IsNullOrEmpty())
{
  // Still works
}

我以前听说过这个bug,据我所知,它从来不会出现在任何真正的代码中,只会出现在像示例这样的代码中,而这些代码并没有真正起到任何作用。此外,该错误与IsNullOrEmpty方法本身无关,因此无论您如何检查字符串,它都会发生

如果该方法完全符合您的要求,您应该使用它。但是,您不应该在任何情况下都使用它来检查空字符串。有时,您只想检查字符串是否为空,而不想检查它是否为空

如果字符串变量为null,则只会跳过代码块:

 if (!String.IsNullOrEmpty(str)) { ... }
如果字符串变量为null,则会导致异常:

 if (str.Length > 0) { ... }

如果变量不应为null,则可能需要异常,而不是代码将null值视为空字符串。如果出现问题,您希望尽早发现问题,因为异常出现的时间越长,就越难追溯到问题的根源。

我想知道为什么人们会使用string.Empty,这不是一件好事,因为它是一个初始化的字符串&这个概念只存在于.Net frame中的任何地方,这是一个len为0的有效字符串(db服务器在这两者之间有非常明确的分界,如果逻辑检查为null,但得到的是空字符串,则会抱怨)。 我认为string.IsNullOrEmpty是我见过的最糟糕的5种实践/函数之一,因为它鼓励/使人们初始化字符串和
可以被视为null。这个函数不应该被添加,我认为.Net的人应该尝试逐步淘汰它:)谁需要空字符串呢?我从来没有使用过它,除非我不得不使用它,因为现有的项目在API中使用它

在实现参数检查时,我通常会分别检查每个条件并抛出不同的异常:
ArgumentNullException
为空引用,或者,根据API规范,空字符串的
ArgumentException
。在这种情况下,使用
String.IsNullOrEmpty
无法区分这两种不同的错误条件

if (str == null)
{
    throw new ArgumentNullException("str");
}
if (str == string.Empty)
{
    throw new ArgumentException("The string cannot be empty.", "str");
}

没有理由复制框架功能。这是一个在.NET2.0sp1中修复的错误-为什么现在要避免它?谢谢,是的,我同意。没有必要为了这么琐碎的事情而卷入一件大事,但只要它是经过修补的