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

207

Apakah penggunaan string.IsNullOrEmpty(string)saat memeriksa string dianggap sebagai praktik buruk ketika ada string.IsNullOrWhiteSpace(string)di .NET 4.0 dan di atasnya?

eomeroff
sumber

Jawaban:

328

Praktik terbaik adalah memilih yang paling tepat.

.Net Framework 4.0 Beta 2 memiliki metode IsNullOrWhiteSpace () baru untuk string yang menggeneralisasi metode IsNullOrEmpty () untuk juga memasukkan ruang putih lain selain string kosong.

Istilah "ruang putih" mencakup semua karakter yang tidak terlihat di layar. Misalnya, spasi, pemisah baris, tab, dan string kosong adalah karakter spasi putih * .

Referensi: Di Sini

Untuk kinerja, IsNullOrWhiteSpace tidak ideal tetapi bagus. Panggilan metode akan menghasilkan penalti kinerja kecil. Lebih lanjut, metode IsWhiteSpace itu sendiri memiliki beberapa tipuan yang dapat dihapus jika Anda tidak menggunakan data Unicode. Seperti biasa, optimasi prematur mungkin jahat, tetapi juga menyenangkan.

Referensi: Di Sini

Periksa kode sumber (Sumber Referensi .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;
}

Contohnya

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
CharithJ
sumber
Sekarang saya bingung: "IsNullOrWhiteSpace adalah metode kenyamanan yang mirip dengan kode berikut, kecuali bahwa ia menawarkan kinerja yang unggul" dari sini: msdn.microsoft.com/en-us/library/…
robasta
@rob Kode yang dimaksud adalah return String.IsNullOrEmpty(value) || value.Trim().Length == 0;, yang melibatkan alokasi string baru dan dua pemeriksaan terpisah. Kemungkinan besar di dalam IsNullOrWhitespace dilakukan melalui pass tunggal tanpa alokasi dengan memeriksa bahwa masing-masing karakter dalam string adalah spasi, maka kinerja yang superior. Apa yang sebenarnya membingungkan Anda?
Ivan Danilov
10
Terima kasih! Saya tidak pernah tahu apakah IsNullOrWhitespace()akan cocok dengan string kosong. Intinya IsNullOrEmpty()cocok dengan subset dari IsNullOrWhitespace().
gligoran
156

Perbedaan dalam praktik:

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
Mohammad Dayyan
sumber
4
Ini harus menjadi jawaban yang diterima menurut saya. Lebih masuk akal daripada jawaban yang diterima dengan menunjukkan contoh aktual daripada redirect.
eaglei22
37

Mereka adalah fungsi yang berbeda. Anda harus memutuskan untuk situasi Anda apa yang Anda butuhkan.

Saya tidak menganggap menggunakan salah satu dari mereka sebagai praktik yang buruk. Sebagian besar waktu IsNullOrEmpty()sudah cukup. Tapi Anda punya pilihan :)

Ivan Danilov
sumber
2
Misalnya, bidang nama pengguna pada halaman pendaftaran akan menggunakan IsNullOrEmtpy untuk memvalidasi sehingga pengguna tidak dapat memiliki spasi sebagai nama mereka.
Chris
14
@Rfvgyhn: jika Anda ingin memeriksa bahwa nama pengguna tidak memiliki ruang di mana pun - Anda harus menggunakan Contains. Jika Anda ingin memastikan bahwa nama pengguna tidak bisa terdiri dari ruang hanya - IsNullOrWhiteSpaceok. IsNullOrEmptymemastikan hanya nama pengguna yang dimasukkan.
Ivan Danilov
1
Memang. Saya hanya mencoba memberikan contoh nyata untuk menambah jawaban Anda. Di dunia nyata, aturan validasi nama pengguna biasanya akan mengandung sedikit lebih banyak logika daripada hanya memeriksa apakah itu kosong atau kosong.
Chris
28

Berikut ini adalah implementasi sebenarnya dari kedua metode (didekompilasi menggunakan 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;
    }
dekdev
sumber
4
Jadi ini berarti IsNullOrWhiteSpacebenar string.Emptyjuga! Itu bonus :)
Ε Г И І И О
4
ya, Paling aman adalah menggunakan IsNullOrWhiteSpace (Benar untuk String.empty, null dan spasi putih)
dekdev
7

Ia mengatakan itu semua IsNullOrEmpty()tidak termasuk spasi putih sementara IsNullOrWhiteSpace()!

IsNullOrEmpty()Jika string:
-Null
-Empty

IsNullOrWhiteSpace()Jika string:
-Null
-Empty
-Berisi Ruang Putih Saja

Hk Shambesh
sumber
2
Saya downvoted karena ketika Anda menjelaskan apa fungsi masing-masing, Anda tidak menjawab pertanyaan yang sebenarnya.
tuespetre
2
Anda harus mengedit jawaban Anda untuk memasukkan seluruh daftar untuk "ruang putih", sebagaimana didefinisikan oleh kerangka kerjanya: Istilah "ruang putih" mencakup semua karakter yang tidak terlihat di layar. Misalnya, spasi, pemisah baris, tab, dan string kosong adalah karakter spasi putih.
georger
2

Lihat ini dengan IsNullOrEmpty dan 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();

Anda akan melihat bahwa IsNullOrWhiteSpace jauh lebih lambat: /

Kabindas
sumber
1
Ini jelas karena IsNullOrEmpty terjadi dalam waktu konstan O (1) sementara IsNullOrwhiteSpace mungkin membutuhkan iterasi penuh dari string atau O (n) waktu. Maka contoh waktunya Anda sebenarnya menggunakan hampir O (n ^ 2) waktu. Untuk satu kali dengan string berukuran normal, perbedaan kinerja akan diabaikan. Jika Anda sedang memproses jumlah teks yang sangat besar atau memanggilnya dalam satu lingkaran besar, maka Anda mungkin tidak ingin menggunakannya.
Charles Owen
1

string.IsNullOrEmpty (str) - jika Anda ingin memeriksa nilai string telah disediakan

string.IsNullOrWhiteSpace (str) - pada dasarnya ini sudah semacam implementasi logika bisnis (yaitu mengapa "" buruk, tetapi sesuatu seperti "~~" baik).

Saran saya - jangan gabungkan logika bisnis dengan pemeriksaan teknis. Jadi, misalnya, string.IsNullOrEmpty adalah yang terbaik untuk digunakan di awal metode untuk memeriksa parameter input mereka.

beloblotskiy
sumber
0

Bagaimana dengan ini untuk menangkap semua ...

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

Ini akan memangkas semua ruang jika ada di sana menghindari hukuman kinerja IsWhiteSpace, yang akan memungkinkan string untuk memenuhi kondisi "kosong" jika bukan nol.

Saya juga berpikir ini lebih jelas dan umumnya merupakan praktik yang baik untuk memangkas string, terutama jika Anda memasukkannya ke dalam database atau sesuatu.

Remotec
sumber
34
Pemeriksaan ini memiliki kelemahan parah. Memanggil Trim () pada x akan menghasilkan pengecualian referensi nol ketika dilewatkan sebagai null.
Ε Г И І И О
9
Poin yang bagus. Saya akan meninggalkan jawaban yang salah untuk menunjukkan kelemahannya.
Remotec
1
IsNullOrWhitespace DAPAT mengoptimalkan untuk memeriksa nol atau kosong, menghindari memeriksa string untuk ruang putih. Metode ini akan selalu melakukan operasi pemangkasan. Juga, meskipun mungkin dioptimalkan jauh, itu mungkin akan membuat string lain di memori.
Sprague
jika (string.IsNullOrEmpty (x? .Trim ()) harus menyelesaikan masalah nol
Cameron Forward
0

Dalam. Net standard 2.0:

string.IsNullOrEmpty(): Menunjukkan apakah string yang ditentukan adalah null atau string Kosong.

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

string.IsNullOrWhiteSpace(): Menunjukkan apakah string yang ditentukan adalah null, kosong, atau hanya terdiri dari karakter spasi putih.

Console.WriteLine(string.IsNullOrWhiteSpace(null));     // True
Console.WriteLine(string.IsNullOrWhiteSpace(""));       // True
Console.WriteLine(string.IsNullOrWhiteSpace(" "));      // True
Console.WriteLine(string.IsNullOrWhiteSpace("  "));     // True
Sina Lotfi
sumber