string.IsNullOrEmpty (string) vs. string.IsNullOrWhiteSpace (string)


207

.NET 4.0 이상에서 string.IsNullOrEmpty(string)문자열을 확인할 때 사용 하는 것이 나쁜 습관으로 간주 string.IsNullOrWhiteSpace(string)됩니까?

답변:


328

가장 좋은 방법은 가장 적합한 방법을 선택하는 것입니다.

.Net Framework 4.0 Beta 2에는 문자열에 대한 새로운 IsNullOrWhiteSpace () 메서드가있어 IsNullOrEmpty () 메서드를 일반화하여 빈 문자열 외에 다른 공백도 포함합니다.

"공백"이라는 용어에는 화면에 표시되지 않는 모든 문자가 포함됩니다. 예를 들어 공백, 줄 바꿈, 탭 및 빈 문자열은 공백 문자 * 입니다.

참조 : 여기

성능면에서 IsNullOrWhiteSpace는 이상적이지 않지만 좋습니다. 메소드 호출은 약간의 성능 저하를 초래합니다. 또한 IsWhiteSpace 메서드 자체에는 유니 코드 데이터를 사용하지 않는 경우 제거 할 수있는 몇 가지 간접 지침이 있습니다. 항상 그렇듯이 조기 최적화는 악의적 일 수 있지만 재미 있습니다.

참조 : 여기

소스 코드 확인 (참조 소스 .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;. 여기에는 새로운 문자열 할당과 두 개의 개별 검사가 포함됩니다. 아마도 IsNullOrWhitespace 내부에서 문자열의 각 문자가 공백인지 확인하여 할당없이 단일 패스를 통해 수행되므로 성능이 뛰어납니다. 실제로 혼동되는 것은 무엇입니까?
Ivan Danilov

10
감사! IsNullOrWhitespace()빈 문자열과 일치 하는지 알 수 없었습니다 . 본질적으로 IsNullOrEmpty()의 하위 집합과 일치합니다 IsNullOrWhitespace().
gligoran

155

실제 차이점 :

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를 사용하여 사용자가 이름으로 공백을 가질 수 없도록 유효성을 검사합니다.
Chris

14
@Rfvgyhn : 당신은 사용자 이름에 공백이없는 것을 확인하려면 어디를 - 당신은 사용해야합니다 Contains. 당신은 사용자 이름에 공백이 구성되지 않도록하려면 단지 - IsNullOrWhiteSpace괜찮습니다. IsNullOrEmpty어떻게 든 사용자 이름 만 입력했는지 확인합니다.
Ivan Danilov

1
과연. 방금 귀하의 답변에 추가 할 구체적인 예를 제시하려고했습니다. 실제로 사용자 이름 유효성 검사 규칙에는 일반적으로 비어 있는지 또는 공백인지 확인하는 것보다 약간 더 많은 논리가 포함됩니다.
Chris

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, null 및 공백에 대해서는 True)를 사용하는 것입니다.
dekdev

7

그것은 모두 IsNullOrEmpty()흰색 간격을 포함하지 않는다고 말합니다 IsNullOrWhiteSpace()!

IsNullOrEmpty()문자열이 다음과
같은 경우 : -Null
-Empty

IsNullOrWhiteSpace()문자열이 다음과
같은 경우 : -Null
-Empty-
공백 만 포함


2
각 기능의 기능을 설명하는 동안 실제 질문에 대답하지 않기 때문에 하향 투표했습니다.
tuespetre

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) 시간을 사용합니다. 보통 크기의 문자열이있는 1 타이머의 경우 성능 차이는 무시할 수 있습니다. 매우 많은 양의 텍스트를 처리하거나 큰 루프에서 호출했다면 사용하고 싶지 않을 것입니다.
Charles Owen

1

string.IsNullOrEmpty (str)-문자열 값이 제공되었는지 확인하려는 경우

string.IsNullOrWhiteSpace (str)-기본적으로 이것은 이미 일종의 비즈니스 로직 구현입니다 (예 : ""는 좋지 않지만 "~~"와 같은 것이 좋은 이유).

나의 충고 – 비즈니스 로직과 기술적 점검을 혼용하지 마십시오. 예를 들어, string.IsNullOrEmpty는 메소드 시작시 입력 매개 변수를 확인하는 데 가장 좋습니다.


0

캐치 모두에 대해 이건 어떻습니까?

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

이렇게하면 IsWhiteSpace의 성능 저하를 피할 수있는 모든 공간을 잘라내어 null이 아닌 경우 문자열이 "빈"조건을 충족 할 수 있습니다.

또한 이것이 명확하고 일반적으로 문자열을 데이터베이스 또는 무언가에 넣는 경우 어쨌든 잘리는 것이 좋습니다.


34
이 검사에는 심각한 단점이 있습니다. x에서 Trim ()을 호출하면 null로 전달 될 때 null 참조 예외가 발생합니다.
Ε Г И І И О 5

9
좋은 지적. 단점을 나타 내기 위해 답을 잘못 남겨 두겠습니다.
Remotec

1
IsNullOrWhitespace는 공백에 대한 문자열 검사를 피하면서 null 또는 비어 있는지 확인하도록 최적화 할 수 있습니다. 이 방법은 항상 트리밍 작업을 수행합니다. 또한 최적화되지는 않았지만 메모리에 다른 문자열을 만들 수 있습니다.
Sprague

if (string.IsNullOrEmpty (x? .Trim ())은 null 문제를 해결해야합니다
Cameron Forward

0

.Net 표준 2.0에서 :

string.IsNullOrEmpty(): 지정된 문자열이 널인지 또는 빈 문자열인지를 나타냅니다.

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.