chuỗi.IsNullOrEmpty (chuỗi) so với chuỗi.IsNullOrWhiteSpace (chuỗi)


207

Được sử dụng string.IsNullOrEmpty(string)khi kiểm tra một chuỗi được coi là thực tiễn xấu khi có string.IsNullOrWhiteSpace(string)trong .NET 4.0 trở lên?

Câu trả lời:


328

Thực hành tốt nhất là chọn một cách thích hợp nhất.

.Net Framework 4.0 Beta 2 có một phương thức IsNullOrWhiteSpace () mới cho các chuỗi tổng quát hóa phương thức IsNullOrEmpty () để bao gồm cả khoảng trắng khác bên cạnh chuỗi trống.

Thuật ngữ không gian trắng xóa trực tuyến, bao gồm tất cả các ký tự không hiển thị trên màn hình. Ví dụ: dấu cách, dấu ngắt dòng, tab và chuỗi trống là các ký tự khoảng trắng * .

Tham khảo: Tại đây

Về hiệu suất, IsNullOrWhiteSpace không lý tưởng nhưng tốt. Các cuộc gọi phương thức sẽ dẫn đến một hình phạt hiệu suất nhỏ. Hơn nữa, bản thân phương thức IsWhiteSpace có một số chỉ dẫn có thể được loại bỏ nếu bạn không sử dụng dữ liệu Unicode. Như mọi khi, tối ưu hóa sớm có thể là xấu xa, nhưng nó cũng rất vui.

Tham khảo: Tại đây

Kiểm tra mã nguồn (Tham chiếu nguồn .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;
}

Ví dụ

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

Bây giờ tôi đang bối rối: "IsNullOrWhiteSpace là một phương thức tiện lợi tương tự như mã sau đây, ngoại trừ việc nó cung cấp hiệu suất vượt trội" từ đây: msdn.microsoft.com/en-us/l
Library / ra

@rob Mã trong câu hỏi là return String.IsNullOrEmpty(value) || value.Trim().Length == 0;, bao gồm phân bổ chuỗi mới và hai kiểm tra riêng biệt. Rất có thể bên trong IsNullOrWhitespace, nó được thực hiện thông qua một lần duy nhất mà không có bất kỳ sự phân bổ nào bằng cách kiểm tra xem mỗi char trong chuỗi là khoảng trắng, do đó hiệu năng vượt trội. Điều gì làm bạn bối rối thực sự?
Ivan Danilov

10
Cảm ơn! Tôi không bao giờ biết nếu IsNullOrWhitespace()phù hợp với một chuỗi trống. Về bản chất IsNullOrEmpty()phù hợp với một tập hợp con của IsNullOrWhitespace().
gligoran

155

Sự khác biệt trong thực tế:

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
Đây nên là câu trả lời được chấp nhận theo ý kiến ​​của tôi. Có ý nghĩa hơn câu trả lời được chấp nhận với việc hiển thị các ví dụ thực tế thay vì chuyển hướng.
Eaglei22

37

Chúng là các chức năng khác nhau. Bạn nên quyết định cho tình huống của bạn những gì bạn cần.

Tôi không coi việc sử dụng bất kỳ trong số họ là một thực hành xấu. Hầu hết thời gian IsNullOrEmpty()là đủ. Nhưng bạn có quyền lựa chọn :)


2
Ví dụ: trường tên người dùng trên trang đăng ký sẽ sử dụng IsNullOrEmtpy để xác thực để người dùng không thể có khoảng trắng làm tên của họ.
Chris

14
@Rfvgyhn: nếu bạn muốn kiểm tra tên người dùng không có chỗ ở bất cứ đâu - bạn nên sử dụng Contains. Nếu bạn muốn đảm bảo rằng tên người dùng không thể bao gồm không gian chỉ - IsNullOrWhiteSpacelà ok. IsNullOrEmptyđảm bảo chỉ tên người dùng đã được nhập bằng cách nào đó.
Ivan Danilov

1
Thật. Tôi chỉ cố gắng đưa ra một ví dụ cụ thể để thêm vào câu trả lời của bạn. Trong thế giới thực, quy tắc xác thực tên người dùng thường sẽ chứa logic hơn một chút so với việc chỉ kiểm tra xem khoảng trống hoặc khoảng trắng của nó.
Chris

28

Đây là cách triển khai thực tế của cả hai phương thức (dịch ngược bằng 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
Vì vậy, điều này có nghĩa IsNullOrWhiteSpacelà đúng cho string.Emptylà tốt! Đó là một phần thưởng :)
é И

4
có, Safest sẽ sử dụng IsNullOrWhiteSpace (Đúng cho String.empty, null và khoảng trắng)
dekdev

7

Nó nói rằng tất cả IsNullOrEmpty()không bao gồm khoảng cách màu trắng trong khi IsNullOrWhiteSpace()không!

IsNullOrEmpty()Nếu chuỗi là:
-Null
-Empty

IsNullOrWhiteSpace()Nếu chuỗi là:
-Null
-Empty -Chỉ duy nhất
Spaces trắng


2
Tôi đánh giá thấp bởi vì trong khi bạn giải thích mỗi chức năng làm gì, bạn không trả lời câu hỏi thực tế.
tuespetre

2
Bạn nên chỉnh sửa câu trả lời của mình để bao gồm toàn bộ danh sách cho "khoảng trắng", như được định nghĩa bởi khung của anh ấy: Thuật ngữ không gian màu trắng Trắng bao gồm tất cả các ký tự không hiển thị trên màn hình. Ví dụ: dấu cách, dấu ngắt dòng, tab và chuỗi trống là các ký tự khoảng trắng.
georger

2

Kiểm tra điều này với IsNullOrEmpty và 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();

Bạn sẽ thấy IsNullOrWhiteSpace chậm hơn nhiều: /


1
Điều này là hiển nhiên bởi vì IsNullOrEmpty xảy ra trong thời gian không đổi O (1) trong khi IsNullOrwhiteSpace có thể yêu cầu lặp lại toàn bộ chuỗi hoặc thời gian O (n). Sau đó, ví dụ về thời gian của bạn thực sự sử dụng thời gian gần O (n ^ 2). Đối với một bộ đếm thời gian với một chuỗi có kích thước bình thường, sự khác biệt hiệu suất sẽ không đáng kể. Nếu bạn đang xử lý một lượng lớn văn bản hoặc gọi nó trong một vòng lặp lớn, thì có lẽ bạn sẽ không muốn sử dụng nó.
Charles Owen

1

chuỗi.IsNullOrEmpty (str) - nếu bạn muốn kiểm tra giá trị chuỗi đã được cung cấp

chuỗi.IsNullOrWhiteSpace (str) - về cơ bản đây đã là một dạng triển khai logic nghiệp vụ (nghĩa là tại sao "" là xấu, nhưng một cái gì đó như "~ ~" là tốt).

Lời khuyên của tôi - không trộn lẫn logic kinh doanh với kiểm tra kỹ thuật. Vì vậy, ví dụ, string.IsNullOrEmpty là cách tốt nhất để sử dụng ở đầu các phương thức để kiểm tra các tham số đầu vào của chúng.


0

Thế còn cái này để bắt tất cả ...

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

Điều này sẽ cắt tất cả các khoảng trắng nếu chúng ở đó tránh hình phạt hiệu năng của IsWhiteSpace, điều này sẽ cho phép chuỗi đáp ứng điều kiện "trống" nếu nó không rỗng.

Tôi cũng nghĩ rằng điều này rõ ràng hơn và thực tế nó thường tốt để cắt các chuỗi dù thế nào, đặc biệt nếu bạn đang đặt chúng vào cơ sở dữ liệu hoặc một cái gì đó.


34
Kiểm tra này có một nhược điểm nghiêm trọng. Gọi Trim () trên x sẽ dẫn đến một ngoại lệ tham chiếu null khi nó được chuyển thành null.
Ε é И

9
Điểm tốt. Ill để lại câu trả lời không chính xác để hiển thị nhược điểm.
Remotec

1
IsNullOrWhitespace CÓ THỂ tối ưu hóa để kiểm tra null hoặc trống, tránh kiểm tra chuỗi cho khoảng trắng. Phương pháp này sẽ luôn thực hiện thao tác cắt tỉa. Ngoài ra, mặc dù có thể được tối ưu hóa, nhưng nó có thể sẽ tạo ra một chuỗi khác trong bộ nhớ.
Sprague

if (string.IsNullOrEmpty (x? .Trim ()) sẽ giải quyết vấn đề null
Cameron Forward

0

Trong tiêu chuẩn .Net 2.0:

string.IsNullOrEmpty(): Cho biết chuỗi được chỉ định là null hay chuỗi rỗng.

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

string.IsNullOrWhiteSpace(): Cho biết một chuỗi được chỉ định là null, trống hoặc chỉ bao gồm các ký tự khoảng trắng.

Console.WriteLine(string.IsNullOrWhiteSpace(null));     // True
Console.WriteLine(string.IsNullOrWhiteSpace(""));       // True
Console.WriteLine(string.IsNullOrWhiteSpace(" "));      // True
Console.WriteLine(string.IsNullOrWhiteSpace("  "));     // True
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.