程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#如何判斷字符串是否為空串?

C#如何判斷字符串是否為空串?

編輯:C#入門知識

其實用過C#的人都知道它會建議你使用String.Length屬性來判斷字符串是否為空串,但你又是否明白其中的緣由呢?今天有點閒,特意寫下這篇文章,希望有點幫助。

1. 三種常用的字符串判空串方法:

Length法:bool isEmpty = (str.Length == 0);
Empty法:bool isEmpty = (str == String.Empty);
General法:bool isEmpty = (str == "");
2. 深入內部機制:

要探討這三種方法的內部機制,我們得首先看看.NET是怎樣實現的,也就是要看看.NET的源代碼!然而,我們哪裡找這些源代碼呢?我們同樣有三種方法:
Rotor法:一個不錯的選擇就是微軟的Rotor,這是微軟的一個源代碼共享項目。
Mono法:另一個不錯的選擇當然就是真正的開源項目Mono啦!
Reflector法:最後一個選擇就是使用反編譯器,不過這種重組的代碼不一定就是原貌,只不過是一種“近似值”,你可以考慮使用Reflector這個反編譯器[1]。
這裡我采用Reflector法,我們先來看看一下源代碼[2](片段):

 public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable, IComparable<string>
{
    static String()
    {
        string.Empty = "";

        // Code here
    }

    // Code here

    public static readonly string Empty;

    public static bool operator ==(string a, string b)
    {
        return string.Equals(a, b);
    }

    public static bool Equals(string a, string b)
    {
        if (a == b)
        {
            return true;
        }
        if ((a != null) && (b != null))
        {
            return string.EqualsHelper(a, b);
        }
        return false;
    }

    private static unsafe bool EqualsHelper(string ao, string bo)
    {
        // Code here

        int num1 = ao.Length;
        if (num1 != bo.Length)
        {
            return false;
        }
       
        // Code here
    }

    private extern int InternalLength();

    public int Length
    {
        get
        {
            return this.InternalLength();
        }
    }

    // Code here
}

Rotor裡面String類的代碼與此沒什麼不同,只是沒有EqualsHelper方法,代之以如下的聲明:
 

 

 public extern bool Equals(String value);

進一步分析:
首先是Empty法,由於String.Empty是一個靜態只讀域,只會被創建一次(在靜態構造函數中)。但當我們使用Empty法進行判空時,.NET還會依次展開調用以下的方法,而後兩個方法內部還會進行對象引用判等!
 public static bool operator ==(string a, string b);
\
\public static bool Equals(string a, string b);
\
\private static unsafe bool EqualsHelper(string ao, string bo);

若使用General法判等的話,情況就“更勝一籌”了!因為.NET除了要依次展開調用上面三個方法之外,還得首先創建一個臨時的空字符串實例,如果你要進行大量的比較,這恐怕是想一想就很嚇人了!
而對於Length法,我們就可以繞過上面這些繁瑣的步驟,直接進行整數(字符串長度)判等,我們知道,大多數情況下,整數判等都要來得快(我實在想不出比它更快的了,在32位系統上,System.Int32運算最快了)!
另外,我們還可以看到,在EqualsHelper方法裡面.NET會先使用Length法來進行判等!可惜的是我無法獲得InternalLength方法的代碼。但我在Mono的源代碼裡面看到更簡明的實現:
 

 

 class String
{
    private int length;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved