这三者中哪一个更好?
string myString = "";
String.IsNullOrEmpty(myString);
vs
string myString = "";
if(myString.Length > 0 || myString != null)
vs
string myString = "";
if (m.Length > 0 | m != null)
前者更清楚,但这些之间有任何性能差异吗?如果字符串从不为空,如果从文本框中取出,可能为空但不为空,该怎么办?
答案 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。