最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中string.Empty和null的區(qū)別詳解

 更新時(shí)間:2015年06月05日 09:45:32   投稿:junjie  
這篇文章主要介紹了C#中string.Empty和null的區(qū)別詳解,本文同時(shí)講解了空字符串和Empty的區(qū)別以及string.Empty與null的區(qū)別,需要的朋友可以參考下

這是一個(gè)及其常見的問題,網(wǎng)上已經(jīng)有關(guān)于這個(gè)問題的很多討論。但是我覺得都是不求甚解,有一些還是在誤導(dǎo)別人。下面我來說下我對(duì)這三者的理解,如有錯(cuò)誤的地方請(qǐng)大家及時(shí)指正。

  一:""與string.Empty我認(rèn)為是一樣的。網(wǎng)上有一篇被轉(zhuǎn)載了幾十遍的文章是這樣說的string.Empty 不分配存儲(chǔ)空間,"" 分配一個(gè)長度為空的存儲(chǔ)空間,我認(rèn)為這句話是錯(cuò)誤并且含糊不清的。

  1、實(shí)際上Empty是string類中的一個(gè)靜態(tài)的只讀字段,他的定義是這樣的:

  public static readonly String Empty = "";

  也就是說string.Empty的內(nèi)部實(shí)現(xiàn)是等于””的。

  2、我要反駁string.Empty 不分配存儲(chǔ)空間,"" 分配一個(gè)長度為空的存儲(chǔ)空間這個(gè)觀點(diǎn)。首先string.Empty與""都會(huì)分配存儲(chǔ)空間,具體的說是都會(huì)在內(nèi)存的棧和堆上分配存儲(chǔ)空間。

  有一點(diǎn)先說明一下,引用類型是將對(duì)象是實(shí)際數(shù)據(jù)保存在堆上, 將對(duì)象在堆上的地址保存在棧上。因此string.Empty與””都會(huì)在棧上保存一個(gè)地址這個(gè)地址占4字節(jié),指向內(nèi)存堆中的某個(gè)長度為0的空間,這個(gè)空 間保存的是string.Empty的實(shí)際值。這個(gè)我可以用VS2010跟蹤下內(nèi)存給大家演示。

上圖中的0x01e81228即是變量str在棧中存儲(chǔ)的地址。

對(duì)于"",請(qǐng)看下圖

這個(gè)圖的效果跟上圖是一樣的,也就是說””也是在棧上保存了一個(gè)地址。

  3、CLR會(huì)對(duì)字符串進(jìn)行優(yōu)化,所以””和string.Empty也都會(huì)被優(yōu)化。

  聲明如下兩個(gè)變量

復(fù)制代碼 代碼如下:

  string str1=””;

  string str2=””;


  str1與str2的引用會(huì)是相同的也就是str1與str2在棧上保存的地址上相同的。請(qǐng)看下圖

上圖是str1的地址。

上圖是str2的地址

4、如果非要說””與string.Empty有什么不同的話,我覺得1是寫法不一樣,string.Empty看起來好看~!~。2是在優(yōu)化 方面稍有差別。string.Empty于c#對(duì)””在語法級(jí)別的優(yōu)化。這點(diǎn)可以通過string.Empty的內(nèi)部實(shí)現(xiàn)看出來。

  public static readonly String Empty = "";

  也就是說””是通過CLR進(jìn)行優(yōu)化的,CLR會(huì)維護(hù)一個(gè)字符串池,以防在堆中創(chuàng)建重復(fù)的字符串。而string.Empty是一種c#語法級(jí)別 的優(yōu)化,是在C#編譯器將代碼編譯為IL(即MSIL)時(shí)進(jìn)行了優(yōu)化,即所有對(duì)string類的靜態(tài)字段Empty的訪問都會(huì)被指向同一引用,以節(jié)省內(nèi)存 空間。

  所以對(duì)””的優(yōu)化更依賴CLR。

  給大家看一下二者編譯后的IL代碼:

  string  str1=””;  編譯后如下:

  ldstr      ""         //從字符串池中取出一個(gè)””(實(shí)際上取的是地址)

  stfld      string ClassLibrary1.Class1::str1   //將””賦給str1(實(shí)際上賦的是地址)

  string  str2=string.Empty; 編譯后如下:

  ldsfld     string [mscorlib]System.String::Empty//取得string類的靜態(tài)字段Empty(實(shí)際上取的是地址)

  stfld      string ClassLibrary1.Class1::str2//將Empty賦給str2(實(shí)際上賦的是地址)

  總結(jié):說了這么一大推我自己都覺得羅嗦,而且初學(xué)者朋友可能會(huì)看不懂。本人語文學(xué)的不好,表達(dá)能力一般還請(qǐng)大家諒解,下面我會(huì)挑要害來說。

  “”與string.Empty在用法與性能上基本沒區(qū)別。string.Empty是在語法級(jí)別對(duì)””的優(yōu)化。

  二、string.Empty與null的區(qū)別

  因?yàn)閟tring.Empty與””基本是一樣的,所以string.Empty與null的區(qū)別也就代表了””與null的區(qū)別。

  1、  那就是string.Empty會(huì)在堆上占用一個(gè)長度為0的空間,而null不會(huì)。具體內(nèi)容如下:

  string str1=””;

  string str2=null;

  如剛才所說str1會(huì)在棧上保存一個(gè)地址,這個(gè)地址占4字節(jié),指向內(nèi)存堆中的某個(gè)長度為0的空間,這個(gè)空間保存的是str1的實(shí)際值。

  str2同樣會(huì)在棧上保存一個(gè)地址,這個(gè)地址也占4字節(jié),但是這個(gè)地址是沒有明確指向的,它哪也不指,其內(nèi)容為0x00000000。如下圖


相關(guān)文章

  • C# foreach獲取循環(huán)索引的四種方法

    C# foreach獲取循環(huán)索引的四種方法

    在C#中使用foreach循環(huán)的時(shí)候我們有時(shí)會(huì)碰到需要索引的情況,在for循環(huán)中我們可以得到循環(huán)索引 , foreach并不直接提供 , 下面介紹4種foreach獲取索引的方法,希望對(duì)大家有用處,需要的朋友可以參考下
    2025-03-03
  • C#實(shí)現(xiàn)將像素轉(zhuǎn)換為頁面單位的方法

    C#實(shí)現(xiàn)將像素轉(zhuǎn)換為頁面單位的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)將像素轉(zhuǎn)換為頁面單位的方法,涉及C#像素轉(zhuǎn)換在圖形繪制中的技巧,需要的朋友可以參考下
    2015-06-06
  • C#中IEnumerator<T>和IEnumerable的區(qū)別

    C#中IEnumerator<T>和IEnumerable的區(qū)別

    在C#中,IEnumerator<T>和IEnumerable是用于實(shí)現(xiàn)迭代的接口,本文主要介紹了C#中IEnumerator<T>和IEnumerable的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C#命名空間與java包的區(qū)別分析

    C#命名空間與java包的區(qū)別分析

    這篇文章主要介紹了C#命名空間與java包的區(qū)別,較為詳細(xì)的分析了C#命名空間與java包的相同點(diǎn)與不同點(diǎn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#函數(shù)out多個(gè)返回值問題

    C#函數(shù)out多個(gè)返回值問題

    這篇文章主要介紹了C#函數(shù)out多個(gè)返回值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#編寫的Base64加密和解密類

    C#編寫的Base64加密和解密類

    本文給大家匯總介紹了幾種C#編寫的Base64加密和解密類的代碼,從簡單到復(fù)雜,都能夠?qū)崿F(xiàn)功能,有需要的小伙伴根據(jù)自己的項(xiàng)目需求參考下吧。
    2015-05-05
  • C#?中的partial?關(guān)鍵字詳解

    C#?中的partial?關(guān)鍵字詳解

    這篇文章主要介紹了C#?中的partial?關(guān)鍵字,partial 關(guān)鍵字用于拆分一個(gè)類、一個(gè)結(jié)構(gòu)、一個(gè)接口或一個(gè)方法的定義到兩個(gè)或更多的文件中,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • C#最簡單的字符串加密解密方法

    C#最簡單的字符串加密解密方法

    這篇文章主要介紹了C#最簡單的字符串加密解密方法,本文直接給出實(shí)例代碼,需要的朋友可以參考下
    2015-05-05
  • WinForm項(xiàng)目中添加幫助文檔功能

    WinForm項(xiàng)目中添加幫助文檔功能

    這篇文章介紹了WinForm項(xiàng)目中添加幫助文檔功能的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • macOS系統(tǒng)下Vscode的python配置教程

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

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

最新評(píng)論

北碚区| 长丰县| 都昌县| 保山市| 安义县| 石阡县| 青河县| 万盛区| 道孚县| 深水埗区| 陕西省| 报价| 昌都县| 吉木乃县| 六安市| 邹城市| 安宁市| 金湖县| 进贤县| 泊头市| 巨鹿县| 杂多县| 中阳县| 临沂市| 正宁县| 丰县| 宕昌县| 三江| 托克托县| 青海省| 商丘市| 永寿县| 宁乡县| 凌云县| 廊坊市| 宁蒗| 安泽县| 津市市| 鲁甸县| 离岛区| 永宁县|