4

string.IsNullOrEmpty(myString.Trim())vsstring.IsNullOrWhiteSpace(myString)

どちらがより高速またはより信頼性が高く、それはなぜですか?

4

6 に答える 6

12

string.IsNullOrEmpty(myString.Trim())myStringの場合は例外をスローしますがnullstring.IsNullOrWhiteSpace(myString)正常に機能するため、信頼性が高くなります。

パフォーマンスに関してstring.IsNullOrWhiteSpaceは、より速いはずです。

string.IsNullOrWhiteSpace(myString)変数が空であるか空白であるかをチェックするための好ましい方法です。

于 2012-11-26T17:26:30.717 に答える
3

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);
    }
于 2012-11-26T18:39:50.783 に答える
1

string.IsNullOrWhiteSpace(myString)は、myStringがnullの場合にNullReferenceExceptionを発生させないため、より信頼性が高くなります。IsNullOrWhiteSpace(myString)はmyString.Trim()よりも高速であると思います。両端に1つのスペースがあり、中央に300万の文字が含まれている文字列を考えてみてください。これらの300万文字は、チェックする前に新しい文字列にコピーする必要があります。IsNullOrWhiteSpaceは、2つの文字を比較する必要があります。

于 2012-11-26T17:27:11.047 に答える
1

String.IsNullOrWhiteSpace()より信頼性が高く、より高速になります。

nullを正しく処理するため、より信頼性が高くなります。また、新しい文字列を作成する必要がないため、より高速になります。

于 2012-11-26T17:28:52.233 に答える
1

最適化の観点からこれまで本当にやりたいのであれば、string.IsNullOrWhiteSpace(myString)すぐに結果を返すことができるので、パフォーマンスが向上します。

次の文字列を取ります。

" B C    " (4 trailing spaces)

string.IsNullOrEmpty(myString.Trim())

  1. 文字列をトリミングし、5文字(前に1つ、後ろに4つのスペース)を繰り返して、「BC」にします。
  2. IsNullOrEmptyは1文字を繰り返し、falseを返します。

合計6文字がチェックされました。

string.IsNullOrWhitespace(myString)

  1. 2文字以上繰り返し、2番目の文字でfalseを返します

合計2文字がチェックされました。

後続スペースの数が多いほど、代替スペースよりもメリットが大きくなりますstring.IsNullOrWhitespace(myString)

他の回答やコメントで述べられているように、追加の文字列のインスタンス化は、Trim()より多くのオーバーヘッドを追加します。

于 2012-11-26T17:30:28.883 に答える
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
于 2021-08-07T21:13:12.977 に答える