string.IsNullOrEmpty (string) กับ string.IsNullOrWhiteSpace (สตริง)


207

การใช้งานstring.IsNullOrEmpty(string)เมื่อตรวจสอบสตริงถือว่าเป็นวิธีปฏิบัติที่ไม่ดีเมื่อมีstring.IsNullOrWhiteSpace(string)ใน. NET 4.0 ขึ้นไป?

คำตอบ:


328

แนวปฏิบัติที่เหมาะสมที่สุดคือการเลือกวิธีที่เหมาะสมที่สุด

.Net Framework 4.0 Beta 2 มีเมธอด IsNullOrWhiteSpace () ใหม่สำหรับสตริงที่ใช้เมธอด IsNullOrEmpty () เพื่อรวมพื้นที่สีขาวอื่น ๆ นอกเหนือจากสตริงว่าง

คำว่า "white space" รวมถึงตัวละครทั้งหมดที่ไม่ปรากฏบนหน้าจอ ตัวอย่างเช่นพื้นที่แบ่งบรรทัดและแท็บสตริงว่างอักขระพื้นที่สีขาว *

อ้างอิง: ที่นี่

เพื่อประสิทธิภาพ 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;ซึ่งเกี่ยวข้องกับการจัดสรรสตริงใหม่และสองการตรวจสอบแยกต่างหาก ส่วนใหญ่อาจจะอยู่ใน 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 เพื่อตรวจสอบความถูกต้องเพื่อให้ผู้ใช้ไม่สามารถมีช่องว่างเป็นชื่อของพวกเขา
คริส

14
@Rfvgyhn: ถ้าคุณต้องการที่จะตรวจสอบชื่อผู้ที่ไม่ได้มีช่องว่างได้ทุกที่ - Containsที่คุณควรใช้ หากคุณต้องการให้แน่ใจว่าชื่อผู้ใช้ต้องไม่ประกอบด้วยช่องว่างเท่านั้น - IsNullOrWhiteSpaceก็โอเค IsNullOrEmptyทำให้มั่นใจได้ว่าชื่อผู้ใช้นั้นถูกป้อนอย่างใด
Ivan Danilov

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
ใช่ Safest จะใช้ IsNullOrWhiteSpace (เป็น True สำหรับ String.empty, null และ whitespace)
dekdev

7

มันบอกว่ามันทั้งหมดIsNullOrEmpty()ไม่รวมระยะห่างสีขาวในขณะที่IsNullOrWhiteSpace()ไม่!

IsNullOrEmpty()หากสตริงคือ:
-Null
-Empty

IsNullOrWhiteSpace()หากสตริงคือ:
-Null
-Empty -Contains
White Spaces เท่านั้น


2
ฉันลงคะแนนเพราะในขณะที่คุณอธิบายว่าแต่ละฟังก์ชั่นทำอะไรคุณไม่ตอบคำถามจริง
อังคาร

2
คุณควรแก้ไขคำตอบของคุณเพื่อรวมรายการทั้งหมดสำหรับ "white space" ตามที่กำหนดโดยกรอบงานของเขา: คำว่า "white space" รวมถึงอักขระทั้งหมดที่ไม่ปรากฏบนหน้าจอ ตัวอย่างเช่นช่องว่างตัวแบ่งบรรทัดแท็บและสตริงว่างคืออักขระช่องว่าง
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
การตรวจสอบนี้มีข้อบกพร่องอย่างรุนแรง การเรียกใช้ Trim () บน x จะทำให้เกิดข้อยกเว้นการอ้างอิงเป็นโมฆะเมื่อมันถูกส่งเป็นโมฆะ
ΕГИІИО

9
จุดดี. ฉันปล่อยให้คำตอบไม่ถูกต้องเพื่อแสดงข้อเสียเปรียบ
Remotec

1
IsNullOrWhitespace อาจปรับให้เหมาะสมเพื่อตรวจสอบ null หรือว่างเปล่าหลีกเลี่ยงการตรวจสอบสตริงสำหรับพื้นที่สีขาว วิธีนี้จะทำการตัดแต่งเสมอ นอกจากนี้แม้ว่ามันอาจถูกปรับให้เหมาะสม แต่ก็อาจสร้างสตริงอื่นในหน่วยความจำ
Sprague

ถ้า (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 ว่างหรือประกอบด้วยอักขระ white-space เท่านั้น

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.