string.IsNullOrEmpty(myString.Trim())
vs string.IsNullOrWhiteSpace(myString)
哪一个更快或更可靠,为什么会这样?
答案 0 :(得分:12)
string.IsNullOrEmpty(myString.Trim())
为myString
,则 null
会抛出异常,而string.IsNullOrWhiteSpace(myString)
会正常工作,因此更可靠。
至于表现,string.IsNullOrWhiteSpace
应该更快。
string.IsNullOrWhiteSpace(myString)
是检查变量是空还是空格的首选方法。
答案 1 :(得分:3)
IsNullOrWhiteSpace是一种类似的便捷方法 以下代码,但它提供了卓越的性能:
return String.IsNullOrEmpty(value) || value.Trim().Length == 0;
可靠性的唯一区别是myString.Trim()
可能会抛出NullReferenceException。
从绩效角度来看,Trim是决定性因素。注意在Trim的情况下,如何从每一端迭代字符串。在某些情况下,这可能特别昂贵,正如@Lukazoid所指出的那样。 IsNullOrWhiteSpace将从头开始,只遍历字符串,直到找到非空白字符。下面是.NET源代码。
public static bool IsNullOrEmpty(String value) {
return (value == null || value.Length == 0);
}
[Pure]
public static bool IsNullOrWhiteSpace(String value) {
if (value == null) return true;
for(int i = 0; i < value.Length; i++) {
if(!Char.IsWhiteSpace(value[i])) return false;
}
return true;
}
// Trims the whitespace from both ends of the string. Whitespace is defined by
// Char.IsWhiteSpace.
//
[Pure]
public String Trim() {
Contract.Ensures(Contract.Result<String>() != null);
Contract.EndContractBlock();
return TrimHelper(TrimBoth);
}
[System.Security.SecuritySafeCritical] // auto-generated
private String TrimHelper(int trimType) {
//end will point to the first non-trimmed character on the right
//start will point to the first non-trimmed character on the Left
int end = this.Length-1;
int start=0;
//Trim specified characters.
if (trimType !=TrimTail) {
for (start=0; start < this.Length; start++) {
if (!Char.IsWhiteSpace(this[start])) break;
}
}
if (trimType !=TrimHead) {
for (end= Length -1; end >= start; end--) {
if (!Char.IsWhiteSpace(this[end])) break;
}
}
return CreateTrimmedString(start, end);
}
答案 2 :(得分:1)
string.IsNullOrWhiteSpace(myString)更可靠,因为当myString为null时,它不会引发NullReferenceException。 我相信IsNullOrWhiteSpace(myString)比myString.Trim()快,想到一个字符串,两端包含1个空格,中间包含300万个其他字符。在检查之前,必须将这三百万个字符复制到一个新字符串。 IsNullOrWhiteSpace必须比较两个字符。
答案 3 :(得分:1)
String.IsNullOrWhiteSpace()
将更可靠,更快。
更可靠,因为它正确处理null。而且速度更快,因为它不需要创建新的字符串。
答案 4 :(得分:1)
如果你真的想在优化方面走得那么远,string.IsNullOrWhiteSpace(myString)
会有更好的表现,因为它能够立即返回结果。
请使用以下字符串:
" B C " (4 trailing spaces)
使用string.IsNullOrEmpty(myString.Trim())
:
共检查了6个字符。
使用string.IsNullOrWhitespace(myString)
:
共检查了2个字符。
尾随空格的数量越大,string.IsNullOrWhitespace(myString)
对替代方案的好处就越大。
作为其他答案和评论中的状态,来自Trim()
的附加字符串结果的实例化会增加更多开销。
答案 5 :(得分:0)
这取决于您的应用程序,但您必须小心转义字符。
这里我们考虑String.IsNullOrEmpty
:
String.IsNullOrEmpty(""); //True
String.IsNullOrEmpty(null); //True
String.IsNullOrEmpty(" "); //False
String.IsNullOrEmpty("\n"); //False
String.IsNullOrEmpty("\t"); //False
String.IsNullOrEmpty("hello"); //False
现在String.IsNullOrWhiteSpace
:
String.IsNullOrWhiteSpace("");//True
String.IsNullOrWhiteSpace(null);//True
String.IsNullOrWhiteSpace(" ");//True
String.IsNullOrWhiteSpace("\n");//True
String.IsNullOrWhiteSpace("\t");//True
String.IsNullOrWhiteSpace("hello");//False