string.IsNullOrEmpty (string) ve string.IsNullOrWhiteSpace (string) karşılaştırması


207

.NET 4.0 ve sonraki sürümlerde string.IsNullOrEmpty(string)kötü uygulama olarak kabul edilen bir dizeyi kontrol ederken kullanımı string.IsNullOrWhiteSpace(string)?

Yanıtlar:


328

En iyi uygulama, en uygun olanı seçmektir.

Net Framework 4.0 Beta 2'de, boş dizenin yanı sıra diğer beyaz boşlukları da içerecek şekilde IsNullOrEmpty () yöntemini genelleyen yeni bir IsNullOrWhiteSpace () yöntemi vardır.

“Beyaz boşluk” terimi, ekranda görünmeyen tüm karakterleri içerir. Örneğin, boşluk, satır sonu, sekme ve boş dize beyaz boşluk karakterlerdir * .

Referans: Burada

Performans için IsNullOrWhiteSpace ideal değil ama iyidir. Yöntem çağrıları küçük bir performans cezasına neden olur. Ayrıca, IsWhiteSpace yönteminin kendisi Unicode verilerini kullanmıyorsanız kaldırılabilecek bazı indirgemelere sahiptir. Her zaman olduğu gibi, erken optimizasyon kötü olabilir, ancak aynı zamanda eğlencelidir.

Referans: Burada

Kaynak kodunu kontrol edin (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;
}

Örnekler

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

Şimdi kafam karıştı: "IsNullOrWhiteSpace, aşağıdaki koda benzer, ancak üstün performans
sunması

@rob Söz konusu kod return String.IsNullOrEmpty(value) || value.Trim().Length == 0;, yeni dize ataması ve iki ayrı denetim içeren koddur . Büyük olasılıkla IsNullOrWhitespace içinde, dizedeki her karakterin boşluk, dolayısıyla üstün performans olup olmadığını kontrol ederek herhangi bir tahsis olmaksızın tek geçişle yapılır. Aslında sizi ne karıştırıyor?
Ivan Danilov

10
Teşekkürler! IsNullOrWhitespace()Boş bir dizeyle eşleşip eşleşmeyeceğini asla bilmiyordum . Özünde IsNullOrEmpty()bir alt kümeyle eşleşir IsNullOrWhitespace().
gligoran

155

Uygulamadaki farklılıklar:

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
Bu benim görüşüme göre kabul edilen cevap olmalı. Yönlendirme yerine gerçek örnekleri göstererek kabul edilen yanıttan daha anlamlı.
eaglei22

37

Bunlar farklı işlevlerdir. Durumunuz için neye ihtiyacınız olduğuna karar vermelisiniz.

Hiçbirini kötü bir uygulama olarak görmüyorum. Çoğu zaman IsNullOrEmpty()yeterlidir. Ama seçimin var :)


2
Örneğin, bir kayıt sayfasındaki bir kullanıcı adı alanı, doğrulamak için IsNullOrEmtpy komutunu kullanır; böylece kullanıcının adı olarak bir boşluk olamaz.
Chris

14
@Rfvgyhn: kullanıcı adının hiçbir yerde boşluk olmadığını kontrol etmek istiyorsanız - kullanmalısınız Contains. Kullanıcı adının yalnızca boşluktan oluşmasını önlemek istiyorsanız - IsNullOrWhiteSpacesorun değil. IsNullOrEmptyyalnızca kullanıcı adının bir şekilde girilmesini sağlar.
Ivan Danilov

1
Aslında. Sadece cevabınıza eklemek için somut bir örnek vermeye çalışıyordum. Gerçek dünyada, bir kullanıcı adı doğrulama kuralı genellikle boş veya boşluk olup olmadığını kontrol etmekten biraz daha mantık içerir.
Chris

28

İşte her iki yöntemin gerçek uygulaması (dotPeek kullanılarak ayrıştırılmış)

[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
Yani bu da demek oluyor IsNullOrWhiteSpaceki string.Empty! Bu bir bonus :)
Г И І И О

4
Evet, Safest IsNullOrWhiteSpace (String.empty, null ve whitespace için True)
kullanacaktır

7

Her şeyin IsNullOrEmpty()beyaz boşluk içermediğini söylüyor IsNullOrWhiteSpace()!

IsNullOrEmpty()Dize ise:
-Null
-boş

IsNullOrWhiteSpace()Dize ise:
-Null
-boş
Sadece -Var Beyaz Spaces


2
İndirdim çünkü her fonksiyonun ne yaptığını açıklarken asıl soruya cevap vermiyorsunuz.
tuespetre

2
Cevabınızı, çerçeve tarafından tanımlanan "beyaz boşluk" için tüm listeyi içerecek şekilde düzenlemelisiniz: "Beyaz boşluk" terimi, ekranda görünmeyen tüm karakterleri içerir. Örneğin, boşluk, satır sonu, sekme ve boş dize boşluk karakteridir.
georger

2

IsNullOrEmpty ve IsNullOrwhiteSpace ile bunu kontrol edin

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'in çok daha yavaş olduğunu göreceksiniz: /


1
Bu açıktır çünkü IsNullOrEmpty sabit zaman O (1) 'de gerçekleşirken, IsNullOrwhiteSpace muhtemelen dizenin tam bir yinelemesini veya O (n) zamanını gerektirir. O zaman zamanlanmış örneğiniz aslında neredeyse O (n ^ 2) zamanı kullanıyor. Normal boyutlu bir dizeye sahip bir zamanlayıcı için, performans farkı ihmal edilebilir olacaktır. Çok fazla miktarda metin işliyor ya da büyük bir döngü halinde çağırıyorsanız, muhtemelen kullanmak istemezsiniz.
Charles Owen

1

string.IsNullOrEmpty (str) - dize değerinin sağlandığını kontrol etmek istiyorsanız

string.IsNullOrWhiteSpace (str) - temelde bu zaten bir tür iş mantığı uygulamasıdır (yani "" neden kötü, ancak "~~" gibi bir şey iyidir).

Benim tavsiyem - iş mantığını teknik kontrollerle karıştırmayın. Örneğin, string.IsNullOrEmpty, giriş parametrelerini kontrol etmek için yöntemlerin başında kullanmak için en iyisidir.


0

Tüm bunlar için ne dersiniz ...

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

Bu, eğer varsa, boş değilse "boş" koşulunu karşılayabilmesini sağlayan IsWhiteSpace'in performans cezasından kaçınarak tüm alanları keser.

Ben de bu daha net olduğunu düşünüyorum ve özellikle de onları bir veritabanına falan koyuyorsanız dizeleri kırpmak için genellikle iyi bir uygulama.


34
Bu kontrolün ciddi bir dezavantajı vardır. X üzerinde Trim () öğesi çağrıldığında, null olarak iletildiğinde boş bir başvuru istisnası oluşur.
Ε Г И І И О

9
İyi bir nokta. Dezavantajı göstermek için cevabı yanlış bırakacağım.
Remotec

1
IsNullOrWhitespace boş veya boş olup olmadığını kontrol etmek için optimize edebilir ve dizede beyaz boşluk olup olmadığını kontrol eder. Bu yöntem daima kırpma işlemini gerçekleştirir. Ayrıca, optimize edilmiş olsa da, muhtemelen bellekte başka bir dize oluşturacaktır.
Sprague

if (string.IsNullOrEmpty (x? .Trim ()) null sorunun etrafından dolaşmalıdır
Cameron Forward

0

Net standard 2.0'da:

string.IsNullOrEmpty(): Belirtilen dizenin boş veya Boş dizgi olduğunu belirtir.

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

string.IsNullOrWhiteSpace(): Belirtilen bir dizenin boş, boş veya yalnızca boşluk karakterlerinden oluşup oluşmadığını gösterir.

Console.WriteLine(string.IsNullOrWhiteSpace(null));     // True
Console.WriteLine(string.IsNullOrWhiteSpace(""));       // True
Console.WriteLine(string.IsNullOrWhiteSpace(" "));      // True
Console.WriteLine(string.IsNullOrWhiteSpace("  "));     // True
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.