C#String.IsNullOrEmpty:好还是坏?
-
18-09-2019 - |
题
事件在工作中,我滥用String.IsNullOrEmpty用Session变量之后,我的同事同事现在拒绝接受我的String.IsNullOrEmpty的使用。经过一番研究,显然有(MSDN上的IsNullOrEmpty中列出的错误的链接)(在底部读注释):
正如2006年4月4日的,有一个错误 (有可能在JIT),使这个 当优化是方法失败 打开。众所周知,影响两个 C#和VB。
的更多信息可以在这里找到(链接) 。微软的错误是“据说”固定后的逆戟鲸,但不幸的是我的雇主仍然使用VS2005。但是,如果问题在2008+就这样吧。这只是我没问题。
虽然我的代码以IsNullOrEmpty我的我的同事的拒绝是盲目无知(IMO),他当然不能告诉我为什么的不的使用它比使用会话变量中的误操作等。我用IsNullOrEmpty遍布我们没有任何问题的代码。就个人而言,我觉得除了在一条语句做两件事情的更具有可读性。
google搜索关于这个问题的意见后,我发现,把利弊/ CON立场的网站。这里有一些我已经知道了这个网站:
https://blog.rthand.com/post/2006 /06/22/1063.aspx
http://www.omegacoder.com/?p=105
一个站点( http://dotnetperls.com/isnullorempty )总结了方法(IMHO)相当好:
下面我们看到的是IsNullOrEmpty 在字符串类型,方法,其 为我们提供了一个很好的和相对 检查是否一个的有效的方法 字符串是确定保存或使用。然而, 性能,它可能会更好 使用手动null检查。空字符串 也可以通过其他方式测试, 在这里我的研究表明,检查 长度是最快的。
假设错误修复代替(和正常工作)在VS2008 / 2010 /等,是没有任何理由的不的使用String.IsNullOrEmpty与VS2005及以后?我知道这看起来可能有点矫枉过正了这样一个愚蠢的小方法,但我想知道是否有更多的幕后事情的后面,如果任何人有不同的解释。
解决方案
此问题是固定在.NET 2.0 SP1。没有理由以避免其使用了。
如果您正在使用.NET 2,你应该有很多其他原因,反正SP1 - 我看不出有任何理由要避免这种情况的不再存在一个bug
其他提示
我以前听说过的错误,并从我永远不能收集它在任何实际的代码时,只有在这样的并没有真正做任何事情的示例代码。此外,该错误不与IsNullOrEmpty方法本身,因此它不管你如何检查字符串出现。
如果该方法不正是你想做的事,你应该使用它。但是,你不应该使用它在任何情况下,检查一个空字符串。有时你只是想检查,如果字符串是空的,如果它不为null。
如果该字符串变量为空,这将只跳过代码块:
if (!String.IsNullOrEmpty(str)) { ... }
如果字符串变量为空,这将导致异常:
if (str.Length > 0) { ... }
如果该变量不应该是零,你可能想的异常,而不是的代码处理空值作为空字符串。如果事情是错的,你要尽可能早地抓住它,因为这将是很难追踪问题回到源较长的例外是从病因。
您可以编写通过该传递一个空字符串来测试这个东西一个空字符串和一个单元测试,并在VS2005和之后在2008年运行它,看看发生了什么。
在中链接错误报告,你包括它指出:
此错误已被固定在微软的.NET Framework 2.0服务包1(SP1)。
自认为是,如果你只要你有.NET 2安装SP1使用VS 2005年,它不应该的问题的情况下。
至于是否使用它,通过CodingHorror 看看这个交一>。
我们使用延长方法string.IsNullOrEmpty
:
public static bool IsNullOrEmpty(this string target)
{
return string.IsNullOrEmpty(target);
}
采用这种方法,即使它是在以前的一些版本打破了,一个错误修正是代码只有一行。
和的能够使用该方法上的字符串实例可能是空的附加实用程序:
string myString = null;
if (myString.IsNullOrEmpty())
{
// Still works
}
我敢肯定它被固定在SP1,但无论如何,你可以创建自己的空或空方法:)
对于任何语言或其一部分,它是所有关于知道优点/缺点,使基于该信息的明智的决定。 IMHO。
当实现参数的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");
}
如果它在你的版本坏了,那么它是微不足道的只是一个静态的方法,将做检查,所以只是做:
public static bool isNull(String s) {
return s == null || s.trim().length == 0;
}
在进入一个大问题了东西,应该是比较容易解决无点。
您不必到处改变它,但你可以用另外一个静态方法的全局替换。
我不知道为什么人们使用的String.Empty,这不是一件好事,因为它是一个初始化字符串和只存在于净框架这个概念无处不在,这是与0(DB服务器使这间很清楚destinction LEN有效的字符串并会抱怨,如果你有逻辑检查空但你和空字符串)。 我认为这是string.IsNullOrEmpty的前5名最差实践/我所见过的功能之一,因为在某种程度上它鼓励/使它看起来好人民初始化字符串自己和 可视为无效。这个功能应该从来没有加入,我觉得净家伙应该尝试将其淘汰:)谁需要和空字符串呢?我从来没有使用它,除非我不得不因为现有项目的使用它