欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 判斷字符串為空的幾種辦法

 更新時間:2013年04月15日 11:01:07   作者:  
C# 判斷字符串為空的幾種辦法,需要的朋友可以參考一下

1. 三種常用的字符串判空串方法:
Length法:bool isEmpty = (str.Length == 0);
Empty法:bool isEmpty = (str == String.Empty);
General法:bool isEmpty = (str == "");
2. 深入內(nèi)部機制:
要探討這三種方法的內(nèi)部機制,我們得首先看看.NET是怎樣實現(xiàn)的,也就是要看看.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是一個靜態(tài)只讀域,只會被創(chuàng)建一次(在靜態(tài)構(gòu)造函數(shù)中)。但當我們使用Empty法進行判空時,.NET還會依次展開調(diào)用以下的方法,而后兩個方法內(nèi)部還會進行對象引用判等!
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除了要依次展開調(diào)用上面三個方法之外,還得首先創(chuàng)建一個臨時的空字符串實例,如果你要進行大量的比較,這恐怕是想一想就很嚇人了!
而對于Length法,我們就可以繞過上面這些繁瑣的步驟,直接進行整數(shù)(字符串長度)判等,我們知道,大多數(shù)情況下,整數(shù)判等都要來得快(我實在想不出比它更快的了,在32位系統(tǒng)上,System.Int32運算最快了)!
另外,我們還可以看到,在EqualsHelper方法里面.NET會先使用Length法來進行判等!可惜的是我無法獲得InternalLength方法的代碼。但我在Mono的源代碼里面看到更簡明的實現(xiàn):
復制代碼 代碼如下:

class String
...{
    private int length;
    public int Length
    ...{
        get
        ...{
            return length;
        }
    }
    // .
}

然而使用Length法進行字符串判空串時,有一點要注意的,就是你必須先判斷該字符串實例是否為空引用,否則將會拋出NullReferenceException異常!于是,我們有了一個經(jīng)過改進的Length法:
復制代碼 代碼如下:

void Foo(string bar)
...{
    if ((bar != null) && (bar.Length == 0))
        //
}

3. 最后總結(jié):
從上面的分析我們可以看到,使用Length法來進行字符串判空串是有著很大的性能優(yōu)勢的,尤其在進行大量字符串判空時!當然首先得判斷字符串實例是否為空引用!

相關(guān)文章

  • C#在winform中實現(xiàn)數(shù)據(jù)增刪改查等功能

    C#在winform中實現(xiàn)數(shù)據(jù)增刪改查等功能

    本篇文章主要是介紹了C#在winform中操作數(shù)據(jù)庫,實現(xiàn)數(shù)據(jù)增刪改查,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Unity AssetBundle打包工具示例詳解

    Unity AssetBundle打包工具示例詳解

    這篇文章主要介紹了Unity AssetBundle打包工具,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • C#中struct與class的區(qū)別詳解

    C#中struct與class的區(qū)別詳解

    本文主要介紹了C#中struct與class的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • C#實現(xiàn)UDP打洞的示例代碼

    C#實現(xiàn)UDP打洞的示例代碼

    這篇文章主要為大家詳細介紹了C#中實現(xiàn)UDP打洞的相關(guān)知識,文中的示例代碼簡潔易懂,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-01-01
  • C#調(diào)用Java方法實例詳解

    C#調(diào)用Java方法實例詳解

    這篇文章主要介紹了C#調(diào)用Java方法實例詳解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • c#入門之分支語句使用方法(三元運算符、if語句、switch語句)

    c#入門之分支語句使用方法(三元運算符、if語句、switch語句)

    這篇文章主要介紹了c#入門之分支語句使用方法,包括三元運算符、if語句、switch語句,需要的朋友可以參考下
    2014-04-04
  • 基于WPF實現(xiàn)彈幕效果的示例代碼

    基于WPF實現(xiàn)彈幕效果的示例代碼

    這篇文章主要為大家詳細介紹了如何利用WPF實現(xiàn)彈幕效果,文中的示例代碼講解詳細,對我們學習或工作有一定幫助,感興趣的小伙伴可以了解一下
    2022-09-09
  • C#實現(xiàn)線程池的簡單示例

    C#實現(xiàn)線程池的簡單示例

    這篇文章主要介紹了C#實現(xiàn)線程池的簡單示例,代碼簡潔易懂,有助于初學的朋友更好的理解C# 的線程池,需要的朋友可以參考下
    2014-07-07
  • RabbitMQ的配置與安裝教程全紀錄

    RabbitMQ的配置與安裝教程全紀錄

    這篇文章主要給大家介紹了關(guān)于RabbitMQ的配置與安裝的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • macOS系統(tǒng)下Vscode的python配置教程

    macOS系統(tǒng)下Vscode的python配置教程

    這篇文章主要介紹了macOS系統(tǒng)下Vscode的python配置教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04

最新評論