String.IsNullOrEmpty(myString)vs myString!= null

时间:2010-01-23 23:25:52

标签: c# string null-string

这三者中哪一个更好?

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

vs

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

vs 

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

前者更清楚,但这些之间有任何性能差异吗?如果字符串从不为空,如果从文本框中取出,可能为空但不为空,该怎么办?

7 个答案:

答案 0 :(得分:17)

嗯,问题中的版本:

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

肯定会 更糟糕,因为你应该首先测试null (不是第二个) - 理想情况下是短路null所以你不要试图打电话给.Length。但通常我会使用string.IsNullOrEmpty。您可以随时编写扩展方法,以便在需要时更简洁(您可以在null值上调用扩展方法)。

static bool HasValue(this string s) {
    return !string.IsNullOrEmpty(s);
}

答案 1 :(得分:4)

使用string.IsNullOrEmpty(str)。它更清晰,更简洁。它不会成为你应用的瓶颈。

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

答案 2 :(得分:2)

我使用的是IsNullOrEmpty。

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

这是另一个 - 有点奇怪 - 的原因。一些后来的程序员必然会过来,抓住他的胡子并说“我认为myString.trim()。长度!= 0更好”并改变它。

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

答案 3 :(得分:2)

正如其他人所说的那样,IsNullOrEmpty()在可维护性方面优于手动检查,并且由于JIT编译器关于内联的运行时决策(参见Eric Gunnerson's comments),因此性能不太可能受到影响。 p>

如果其他人想知道实际的.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(即原生)图像中内联。

答案 4 :(得分:1)

String.IsNullOrEmpty如果你对如何测试字符串引用的不同状态(你显然是错误的那样......)不安全就更好了。

使用IsNullOrEmpty方法:

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

相当于使用零和零长度的短路测试:

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

如果您知道referene不能为null,则可以跳过该检查并检查长度:

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

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

答案 5 :(得分:0)

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

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

API中的

答案 6 :(得分:-2)

  

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

那是错的。尝试它,你将得到一个例外,因为将尝试两个语句。如果s为null,则s.Length将抛出一个execption。