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

C#之CLR內(nèi)存字符串常量池(string)

 更新時間:2014年08月04日 11:40:54   投稿:shichen2014  
這篇文章主要介紹了C#之CLR內(nèi)存字符串常量池(string),對于學(xué)習(xí)和理解C#內(nèi)存原理很有幫助,需要的朋友可以參考下

C#中的string是比特殊的類,說引用類型,但不存在堆里面,而且String str=new String("HelloWorld")這樣的重裝也說沒有的。

我們先來看一個方法:

class Program
{
  static void Main(string[] args)
  {
    String s = "HelloWorld";
    Console.WriteLine(s);
  }
}

然后我們用ildasm.exe工具把它生成IL語言來看一看它里面是怎么玩的:

.method private hidebysig static void Main(string[] args) cil managed
{
 .entrypoint
 // Code size    15 (0xf)
 .maxstack 1
 .locals init ([0] string s)
 IL_0000: nop
 IL_0001: ldstr   "HelloWorld"
 IL_0006: stloc.0
 IL_0007: ldloc.0
 IL_0008: call    void [mscorlib]System.Console::WriteLine(string)
 IL_000d: nop
 IL_000e: ret
} // end of method Program::Main

我們在里面并沒有看見newObj(所以我們認(rèn)為不在堆里面)的指令,只有一個特殊ldstr(load string)指令,它用從元數(shù)據(jù)獲取一個文本常量字符串(字符串常量池)構(gòu)造一個String對象。這證明了CLR說用一種特殊的方式構(gòu)造了字符串。

我們再舉一個簡單例子看看:

class Program
{
  static void Main(string[] args)
  {
    String s = "HelloWorld";
    s = "HelloC#";
    s = "HelloJava";
    String s1= "HelloC#";
    Console.WriteLine(s);
  }
}

對照這個例子我們來看看內(nèi)存圖是怎么走的:

首先CLR內(nèi)部機(jī)制會在運(yùn)行這個方法之前就會有"prologue"代碼去開辟內(nèi)存空間,s和s1就說這個時候創(chuàng)建的。

我們創(chuàng)建了一個s的字符串對象,賦值為HelloWorld,把s插入棧,然后內(nèi)部機(jī)制去字符串常量池中找HelloWorld副本,發(fā)現(xiàn)沒有找到就會創(chuàng)建一個,接著會去保存這個HelloWorld在字符串常量池中的地址(Line1)。然后我們?yōu)閟對象在賦值為HelloC#,由于同一個對象,棧中不做操作,去字符串常量池中找,沒找到則創(chuàng)建,然后修改s所存儲的地址(line 2),HelloJava同樣的操作。 再創(chuàng)建一個s1的string對象,把s1壓入棧,為S1賦值HelloC#,這個時候會去字符常量池中找,找到了就存這個引用。

相關(guān)文章

  • C#反射之基礎(chǔ)應(yīng)用實(shí)例總結(jié)

    C#反射之基礎(chǔ)應(yīng)用實(shí)例總結(jié)

    這篇文章主要介紹了C#反射之基礎(chǔ)應(yīng)用實(shí)例總結(jié),包括了反射的基本原理與用法實(shí)例,需要的朋友可以參考下
    2014-10-10
  • C#中私有構(gòu)造函數(shù)的特點(diǎn)和用途實(shí)例解析

    C#中私有構(gòu)造函數(shù)的特點(diǎn)和用途實(shí)例解析

    這篇文章主要介紹了C#中私有構(gòu)造函數(shù)的特點(diǎn)和用途,需要的朋友可以參考下
    2014-08-08
  • C#之lock的使用及說明

    C#之lock的使用及說明

    這篇文章主要介紹了C#之lock的使用及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 使用C#在注冊表中保存信息的例子

    使用C#在注冊表中保存信息的例子

    最近做的項(xiàng)目需要在注冊表中記錄一些用戶設(shè)置,方便在程序下次啟動時讀取設(shè)置,應(yīng)用上次用戶保存的設(shè)置,挺簡單的
    2014-04-04
  • C#文件和字節(jié)流的轉(zhuǎn)換方法

    C#文件和字節(jié)流的轉(zhuǎn)換方法

    這篇文章主要介紹了C#文件和字節(jié)流的轉(zhuǎn)換方法,涉及C#將文件以字節(jié)流形式讀取及將字節(jié)流寫入文件的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C#/VB.NET?實(shí)現(xiàn)彩色PDF轉(zhuǎn)為灰度PDF

    C#/VB.NET?實(shí)現(xiàn)彩色PDF轉(zhuǎn)為灰度PDF

    本文以C#代碼為例介紹如何實(shí)現(xiàn)將彩色PDF文件轉(zhuǎn)為灰度(黑白)的PDF文件,即將PDF文檔里面的彩色圖片或者文字等通過調(diào)用方法轉(zhuǎn)為文檔頁面為灰色調(diào)、無彩色效果的文檔。快來跟隨小編一起學(xué)習(xí)吧
    2021-11-11
  • C#生成唯一不重復(fù)訂單號

    C#生成唯一不重復(fù)訂單號

    本文給大家介紹的是使用C#生成唯一不重復(fù)訂單號的方法,主要用到了lock鎖,有需要的小伙伴可以參考下。
    2015-07-07
  • C#實(shí)現(xiàn)Redis的分布式鎖

    C#實(shí)現(xiàn)Redis的分布式鎖

    我們在開發(fā)很多業(yè)務(wù)場景會使用到鎖,例如庫存控制,抽獎等。分布式與單機(jī)情況下最大的不同在于其不是多線程而是多進(jìn)程。本文就來介紹一下,感興趣的可以了解一下
    2021-08-08
  • C#實(shí)現(xiàn)鼠標(biāo)消息捕獲

    C#實(shí)現(xiàn)鼠標(biāo)消息捕獲

    這篇文章介紹了C#實(shí)現(xiàn)鼠標(biāo)消息捕獲的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • async and await 的入門基礎(chǔ)操作

    async and await 的入門基礎(chǔ)操作

    本篇文章對async and await 的入門基礎(chǔ)操作進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

汾西县| 乐安县| 龙井市| 邵东县| 朝阳区| 榆社县| 绥化市| 耿马| 鄂尔多斯市| 治多县| 通州市| 沧州市| 平泉县| 中宁县| 碌曲县| 津南区| 韶山市| 房产| 铜梁县| 扎赉特旗| 清涧县| 吉首市| 中超| 沾益县| 嘉荫县| 遂溪县| 扬州市| 双流县| 渭南市| 凌源市| 新乡县| 红安县| 河源市| 桃园市| 逊克县| 绥化市| 榆树市| 敖汉旗| 宁强县| 普洱| 湖南省|