string.IsNullOrEmpty(string)とstring.IsNullOrWhiteSpace(string)


207

.NET 4.0以降string.IsNullOrEmpty(string)にある場合、文字列をチェックするときにを使用することは悪い習慣と見なされstring.IsNullOrWhiteSpace(string)ますか?

回答:


328

ベストプラクティスは、最も適切なものを選択することです。

.Net Framework 4.0 Beta 2には、文字列用の新しいIsNullOrWhiteSpace()メソッドがあり、IsNullOrEmpty()メソッドを一般化して、空の文字列以外の空白も含めます。

「空白」という用語には、画面に表示されないすべての文字が含まれます。たとえば、スペース、改行、タブ、空の文字列は空白文字*です。

参照:ここに

パフォーマンスに関しては、IsNullOrWhiteSpaceは理想的ではありませんが、優れています。メソッドを呼び出すと、パフォーマンスが少し低下します。さらに、IsWhiteSpaceメソッド自体には、Unicodeデータを使用していない場合に削除できるいくつかの間接指定があります。いつものように、時期尚早の最適化は悪いかもしれませんが、それも楽しいです。

参照:ここに

ソースコードを確認する(Reference Source .NET Framework 4.6.2)

IsNullorEmpty

[Pure]
public static bool IsNullOrEmpty(String value) {
    return (value == null || value.Length == 0);
}

IsNullOrWhiteSpace

[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;
}

string nullString = null;
string emptyString = "";
string whitespaceString = "    ";
string nonEmptyString = "abc123";

bool result;

result = String.IsNullOrEmpty(nullString);            // true
result = String.IsNullOrEmpty(emptyString);           // true
result = String.IsNullOrEmpty(whitespaceString);      // false
result = String.IsNullOrEmpty(nonEmptyString);        // false

result = String.IsNullOrWhiteSpace(nullString);       // true
result = String.IsNullOrWhiteSpace(emptyString);      // true
result = String.IsNullOrWhiteSpace(whitespaceString); // true
result = String.IsNullOrWhiteSpace(nonEmptyString);   // false

今、私は混乱している:ここから「IsNullOrWhiteSpaceは、それが優れた性能を提供しています以外は、次のコードに似ている便利なメソッドです」:msdn.microsoft.com/en-us/library/...は
robasta

@rob問題のコードはですreturn String.IsNullOrEmpty(value) || value.Trim().Length == 0;。これには、新しい文字列の割り当てと2つの個別のチェックが含まれます。ほとんどの場合、IsNullOrWhitespaceの内部では、文字列の各文字が空白であることを確認することにより、割り当てなしでシングルパスを介して行われるため、パフォーマンスが向上します。実際に何を混乱させるのですか?
Ivan Danilov 2014

10
ありがとう!IsNullOrWhitespace()空の文字列と一致するかどうかは知りませんでした。本質的にIsNullOrEmpty()はのサブセットに一致しIsNullOrWhitespace()ます。
グリゴラン2015

156

実際の違い:

string testString = "";
Console.WriteLine(string.Format("IsNullOrEmpty : {0}", string.IsNullOrEmpty(testString)));
Console.WriteLine(string.Format("IsNullOrWhiteSpace : {0}", string.IsNullOrWhiteSpace(testString)));
Console.ReadKey();

Result :
IsNullOrEmpty : True
IsNullOrWhiteSpace : True

**************************************************************
string testString = " MDS   ";

IsNullOrEmpty : False
IsNullOrWhiteSpace : False

**************************************************************
string testString = "   ";

IsNullOrEmpty : False
IsNullOrWhiteSpace : True

**************************************************************
string testString = string.Empty;

IsNullOrEmpty : True
IsNullOrWhiteSpace : True

**************************************************************
string testString = null;

IsNullOrEmpty : True
IsNullOrWhiteSpace : True

4
これは私の意見では受け入れられるべき答えです。リダイレクトではなく実際の例を示すことで、受け入れられた回答よりも理にかなっています。
eaglei22

37

それらは異なる機能です。状況に応じて、何が必要かを決定する必要があります。

私はそれらのいずれかを悪い習慣として使用することを考えていません。ほとんどの場合IsNullOrEmpty()十分です。しかし、あなたには選択肢があります:)


2
たとえば、登録ページのユーザー名フィールドは、IsNullOrEmtpyを使用して検証するため、ユーザーは名前としてスペースを使用できません。
クリス

14
@Rfvgyhn:ユーザー名にスペースがないことを確認したい場合はどこでも -あなたが使用する必要がありますContains。ユーザー名は、スペースで構成することができないようにしたい場合のみ - IsNullOrWhiteSpaceokです。IsNullOrEmptyユーザー名が何らかの方法で入力されたことのみを確認します。
Ivan Danilov、2011

1
確かに。私はあなたの答えに追加する具体的な例を挙げようとしていました。現実の世界では、ユーザー名検証ルールには通常、空か空白かをチェックするだけのロジックよりも少し多くのロジックが含まれます。
クリス

28

以下は、両方のメソッドの実際の実装です(dotPeekを使用して逆コンパイル)。

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
    public static bool IsNullOrEmpty(string value)
    {
      if (value != null)
        return value.Length == 0;
      else
        return true;
    }

    /// <summary>
    /// Indicates whether a specified string is null, empty, or consists only of white-space characters.
    /// </summary>
    /// 
    /// <returns>
    /// true if the <paramref name="value"/> parameter is null or <see cref="F:System.String.Empty"/>, or if <paramref name="value"/> consists exclusively of white-space characters.
    /// </returns>
    /// <param name="value">The string to test.</param>
    public static bool IsNullOrWhiteSpace(string value)
    {
      if (value == null)
        return true;
      for (int index = 0; index < value.Length; ++index)
      {
        if (!char.IsWhiteSpace(value[index]))
          return false;
      }
      return true;
    }

4
つまり、これIsNullOrWhiteSpaceは当てはまりstring.Emptyます!それはボーナスだ:)
ΕГИІИО

4
はい、最も安全なのはIsNullOrWhiteSpaceを使用することです(String.emptyの場合はTrue、nullおよび空白文字)
dekdev

7

それはすべてIsNullOrEmpty()が白いスペースを含んでいない間それを言いIsNullOrWhiteSpace()ます!

IsNullOrEmpty()文字列の場合:
-null
-empty

IsNullOrWhiteSpace()文字列の場合:
-Null
-empty
のみ-containsホワイトスペース


2
各関数の機能を説明する一方で、実際の質問には答えないため、私は反対票を投じました。
tuespetre 2014年

2
フレームワークで定義されているように、回答を編集して「空白」のリスト全体を含める必要があります。「空白」という用語には、画面に表示されないすべての文字が含まれます。たとえば、スペース、改行、タブ、空の文字列は空白文字です。
georger

2

IsNullOrEmptyとIsNullOrwhiteSpaceでこれを確認してください

string sTestes = "I like sweat peaches";
    Stopwatch stopWatch = new Stopwatch();
    stopWatch.Start();
    for (int i = 0; i < 5000000; i++)
    {
        for (int z = 0; z < 500; z++)
        {
            var x = string.IsNullOrEmpty(sTestes);// OR string.IsNullOrWhiteSpace
        }
    }

    stopWatch.Stop();
    // Get the elapsed time as a TimeSpan value.
    TimeSpan ts = stopWatch.Elapsed;
    // Format and display the TimeSpan value. 
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 10);
    Console.WriteLine("RunTime " + elapsedTime);
    Console.ReadLine();

IsNullOrWhiteSpaceの方がはるかに遅いことがわかります:/


1
IsNullOrEmptyは一定時間O(1)で発生するのに対し、IsNullOrwhiteSpaceは文字列またはO(n)時間の完全な反復を必要とする可能性があるため、これは明らかです。次に、時間指定の例は実際にはほぼO(n ^ 2)時間を使用しています。通常サイズの文字列を持つワンタイマーの場合、パフォーマンスの違いはごくわずかになります。非常に大量のテキストを処理したり、大きなループでそれを呼び出したりする場合は、おそらくそれを使用したくないでしょう。
Charles Owen、

1

string.IsNullOrEmpty(str)-文字列の値が提供されていることを確認したい場合

string.IsNullOrWhiteSpace(str)-基本的に、これは既に一種のビジネスロジック実装です(つまり、「」が悪いが、「~~」のようなものが良い理由)。

私のアドバイス-ビジネスロジックとテクニカルチェックを混在させないでください。したがって、たとえば、string.IsNullOrEmptyは、メソッドの最初に入力パラメーターを確認するために使用するのが最適です。


0

キャッチオールのこれについては...

if (string.IsNullOrEmpty(x.Trim())
{
}

これにより、IsWhiteSpaceのパフォーマンスペナルティが回避され、すべてのスペースが削除されます。これにより、文字列がnullでない場合に「空」の条件を満たすことができます。

また、これはより明確であり、特にデータベースなどに文字列を配置する場合は、とにかく文字列をトリムすることをお勧めします。


34
このチェックには重大な欠点があります。xでTrim()を呼び出すと、nullとして渡されたときにnull参照例外が発生します。
ΕГИІИО

9
いい視点ね。欠点を示すために、答えは間違ったままにしておきます。
Remotec

1
IsNullOrWhitespaceは、空白がないか文字列をチェックすることを避けて、nullまたは空をチェックするように最適化できます(MAY)。このメソッドは常にトリミング操作を実行します。また、最適化されても、メモリ内に別の文字列が作成される可能性があります。
スプレーグ

if(string.IsNullOrEmpty(x?.Trim())がnullの問題を回避する必要がある場合
Cameron Forward

0

.Net標準2.0の場合:

string.IsNullOrEmpty():指定された文字列がnullまたは空の文字列かどうかを示します。

Console.WriteLine(string.IsNullOrEmpty(null));           // True
Console.WriteLine(string.IsNullOrEmpty(""));             // True
Console.WriteLine(string.IsNullOrEmpty(" "));            // False
Console.WriteLine(string.IsNullOrEmpty("  "));           // False

string.IsNullOrWhiteSpace():指定された文字列がnull、空、または空白文字のみで構成されているかどうかを示します。

Console.WriteLine(string.IsNullOrWhiteSpace(null));     // True
Console.WriteLine(string.IsNullOrWhiteSpace(""));       // True
Console.WriteLine(string.IsNullOrWhiteSpace(" "));      // True
Console.WriteLine(string.IsNullOrWhiteSpace("  "));     // True
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.