string.IsNullOrEmpty(myString.Trim())
vsstring.IsNullOrWhiteSpace(myString)
どちらがより高速またはより信頼性が高く、それはなぜですか?
string.IsNullOrEmpty(myString.Trim())
vsstring.IsNullOrWhiteSpace(myString)
どちらがより高速またはより信頼性が高く、それはなぜですか?
string.IsNullOrEmpty(myString.Trim())
myString
の場合は例外をスローしますがnull
、string.IsNullOrWhiteSpace(myString)
正常に機能するため、信頼性が高くなります。
パフォーマンスに関してstring.IsNullOrWhiteSpace
は、より速いはずです。
string.IsNullOrWhiteSpace(myString)
変数が空であるか空白であるかをチェックするための好ましい方法です。
IsNullOrWhiteSpaceは、優れたパフォーマンスを提供することを除いて、次のコードに似た便利なメソッドです。
return String.IsNullOrEmpty(value) || value.Trim().Length == 0;
信頼性の唯一の違いは、 NullReferenceExceptionmyString.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);
}
string.IsNullOrWhiteSpace(myString)は、myStringがnullの場合にNullReferenceExceptionを発生させないため、より信頼性が高くなります。IsNullOrWhiteSpace(myString)はmyString.Trim()よりも高速であると思います。両端に1つのスペースがあり、中央に300万の文字が含まれている文字列を考えてみてください。これらの300万文字は、チェックする前に新しい文字列にコピーする必要があります。IsNullOrWhiteSpaceは、2つの文字を比較する必要があります。
String.IsNullOrWhiteSpace()
より信頼性が高く、より高速になります。
nullを正しく処理するため、より信頼性が高くなります。また、新しい文字列を作成する必要がないため、より高速になります。
最適化の観点からこれまで本当にやりたいのであれば、string.IsNullOrWhiteSpace(myString)
すぐに結果を返すことができるので、パフォーマンスが向上します。
次の文字列を取ります。
" B C " (4 trailing spaces)
とstring.IsNullOrEmpty(myString.Trim())
:
合計6文字がチェックされました。
とstring.IsNullOrWhitespace(myString)
:
合計2文字がチェックされました。
後続スペースの数が多いほど、代替スペースよりもメリットが大きくなりますstring.IsNullOrWhitespace(myString)
。
他の回答やコメントで述べられているように、追加の文字列のインスタンス化は、Trim()
より多くのオーバーヘッドを追加します。
アプリケーションによって異なりますが、エスケープ文字に注意する必要があります。ここで検討し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