麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > C# > 正文

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

2020-01-24 03:28:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1. 三種常用的字符串判空串方法:
Length法:bool isEmpty = (str.Length == 0);
Empty法:bool isEmpty = (str == String.Empty);
General法:bool isEmpty = (str == "");
2. 深入內(nèi)部機(jī)制:
要探討這三種方法的內(nèi)部機(jī)制,我們得首先看看.NET是怎樣實(shí)現(xiàn)的,也就是要看看.NET的源代碼!然而,我們哪里找這些源代碼呢?我們同樣有三種方法:
Rotor法:一個(gè)不錯(cuò)的選擇就是微軟的Rotor,這是微軟的一個(gè)源代碼共享項(xiàng)目。
Mono法:另一個(gè)不錯(cuò)的選擇當(dāng)然就是真正的開(kāi)源項(xiàng)目Mono啦!
Reflector法:最后一個(gè)選擇就是使用反編譯器,不過(guò)這種重組的代碼不一定就是原貌,只不過(guò)是一種“近似值”,你可以考慮使用Reflector這個(gè)反編譯器[1]。
這里我采用Reflector法,我們先來(lái)看看一下源代碼[2](片段):
復(fù)制代碼 代碼如下:

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類的代碼與此沒(méi)什么不同,只是沒(méi)有EqualsHelper方法,代之以如下的聲明:
public extern bool Equals(String value);
進(jìn)一步分析:
首先是Empty法,由于String.Empty是一個(gè)靜態(tài)只讀域,只會(huì)被創(chuàng)建一次(在靜態(tài)構(gòu)造函數(shù)中)。但當(dāng)我們使用Empty法進(jìn)行判空時(shí),.NET還會(huì)依次展開(kāi)調(diào)用以下的方法,而后兩個(gè)方法內(nèi)部還會(huì)進(jìn)行對(duì)象引用判等!
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法判等的話,情況就“更勝一籌”了!因?yàn)?NET除了要依次展開(kāi)調(diào)用上面三個(gè)方法之外,還得首先創(chuàng)建一個(gè)臨時(shí)的空字符串實(shí)例,如果你要進(jìn)行大量的比較,這恐怕是想一想就很?chē)樔肆耍?BR>而對(duì)于Length法,我們就可以繞過(guò)上面這些繁瑣的步驟,直接進(jìn)行整數(shù)(字符串長(zhǎng)度)判等,我們知道,大多數(shù)情況下,整數(shù)判等都要來(lái)得快(我實(shí)在想不出比它更快的了,在32位系統(tǒng)上,System.Int32運(yùn)算最快了)!
另外,我們還可以看到,在EqualsHelper方法里面.NET會(huì)先使用Length法來(lái)進(jìn)行判等!可惜的是我無(wú)法獲得InternalLength方法的代碼。但我在Mono的源代碼里面看到更簡(jiǎn)明的實(shí)現(xiàn):
復(fù)制代碼 代碼如下:

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

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

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

3. 最后總結(jié):
從上面的分析我們可以看到,使用Length法來(lái)進(jìn)行字符串判空串是有著很大的性能優(yōu)勢(shì)的,尤其在進(jìn)行大量字符串判空時(shí)!當(dāng)然首先得判斷字符串實(shí)例是否為空引用!
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 91社区在线观看 | 欧美大电影免费观看 | 欧美在线观看视频一区二区 | 91精品国产91 | 久久亚洲精品国产 | 久草在线网址 | 狠狠婷婷综合久久久久久妖精 | 97人操| 国产手机在线视频 | 国产色视频在线观看免费 | 国产免费乱淫av | 久久久新 | 一级毛片免费高清 | 欧美黄色大片免费观看 | 91成人久久 | 国产精品久久久久久影院8一贰佰 | 天堂成人国产精品一区 | 久久久精品网 | 欧美人的天堂一区二区三区 | 日韩一级电影在线观看 | www.777含羞草 | 日韩大片在线永久观看视频网站免费 | 久久久精品视频免费 | www国产免费 | 噜噜社| 最新中文字幕在线视频 | 亚洲欧美成aⅴ人在线观看 免费看欧美黑人毛片 | 久久视频精品 | 欧美激情第一区 | 日韩激情一区 | 依人在线视频 | 亚洲一区久久 | 亚洲精品欧美在线 | 国产精品视频一区二区三区综合 | 天天夜干| 永久av在线免费观看 | 91短视频免费| 久久夜夜视频 | 精品一区二区三区免费爱 | 精品久久久久久久久久久aⅴ | 一区二区三区欧美在线 |