8

这三个中哪个更好?

string myString = ""; 
String.IsNullOrEmpty(myString);

vs

string myString = "";
if(myString.Length > 0 || myString != null)

vs 

string myString = "";
if (m.Length > 0 | m != null)

前者更清楚,但这些之间有什么性能差异吗?如果一个字符串从不为空,比如从一个文本框中获取,它可能是空的但不是 null 怎么办?

4

7 回答 7

18

好吧,问题中的版本:

if(myString.Length > 0 || myString != null)

肯定更糟,因为您应该测试null 第一个(而不是第二个)-理想情况下短路,null这样您就不会尝试调用.Length. 但一般我只会使用string.IsNullOrEmpty. 如果需要,您总是可以编写一个扩展方法以使其不那么冗长(您可以在null值上调用扩展方法)。

static bool HasValue(this string s) {
    return !string.IsNullOrEmpty(s);
}
于 2010-01-23T23:28:54.353 回答
4

一起去string.IsNullOrEmpty(str)。它更清晰,更简洁。它不会成为您应用程序的瓶颈。

如果您只需要检查字符串“emptiness”,那么我会进行检查,string.Empty因为它可以更好地表达您的意图。

于 2010-01-23T23:27:27.847 回答
2

我会使用 IsNullOrEmpty。

稍后查看代码时会更容易解析。

这是另一个 - 有点奇怪 - 原因。一些后来的程序员一定会在以后出现,刮胡子说“我认为 myString.trim().Length != 0 更好”并改变它。

正如其他人指出的那样:检查空秒是等待发生的潜在空访问错误 - 库例程保证没问题。

于 2010-01-23T23:50:43.073 回答
2

正如其他人所说,IsNullOrEmpty() 在可维护性方面优于手动检查,并且由于 JIT 编译器关于内联的运行时决策,不太可能影响性能(请参阅Eric Gunnerson 的评论)。

如果其他人想知道实际的 .NET 实现是什么样的,这里是 .NET 4 代码:

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool IsNullOrEmpty(string value)
{
    if (value != null)
    {
        return (value.Length == 0);
    }
    return true;
}

该属性表示该方法也将内联在 NGen(即本机)图像中。

于 2010-01-24T07:39:49.463 回答
1

String.IsNullOrEmpty如果您对如何测试字符串引用的不同状态不安全(显然是,因为您弄错了......;),这是更好的选择。

使用IsNullOrEmpty方法:

if (String.IsNullOrEmpty(s)) ...

相当于对空值和零长度使用短路测试:

if (s == null || s.Length == 0) ...

如果您知道引用不能为空,则可以跳过该检查并仅检查长度:

if (s.Length == 0) ...

IsNullOrEmpty方法也适用于正常情况,但在出现问题并且引用实际上为空的情况下,该IsNullOrEmpty方法会默默地接受它,而您通常希望知道错误。

于 2010-01-24T00:19:30.430 回答
0

我相信 String.IsNullOrEmpty(String s) 被实现为:

if (s == null || s.Length == 0) ...

在 API 中。

于 2010-01-24T00:36:07.770 回答
-3

I believe the String.IsNullOrEmpty(String s) is implemented as: if (s == null || s.Length == 0) ... in the API.

那是错误的。试试看,你会得到一个例外,因为这两个语句都会被尝试。如果 s 为 null,则 s.Length 将抛出一个异常。

于 2012-03-22T14:26:36.717 回答