在.NET程序中正確使用String類型
2006/12/15 23:17:10
在實際程序中,String類型用得非常廣泛,然而,由于.NET對String類型變量的獨特管理方式,使用不當(dāng),會嚴(yán)重影響程序的性能。我們分幾個方面來談這個問題:

  1、了解String數(shù)據(jù)的內(nèi)存分配方式

  編寫一個控制臺應(yīng)用程序,輸入以下測試代碼:

    class Program
{
static void Main(string[] args)
{
String s = "a";
s = "abcd";
}
}
  使用.NET Framework 2.0 SDK提供的ildasm.exe工具查看生成的MSIL指令:

    01 .method private hidebysig static void Main(string[] args) cil managed
02 {
03 .entrypoint
04 // 代碼大小 14 (0xe)
05 .maxstack 1
06 .locals init ([0] string s)
07 IL_0000: nop
08 IL_0001: ldstr "a"
09 IL_0006: stloc.0
10 IL_0007: ldstr "abcd"
11 IL_000c: stloc.0
12 IL_000d: ret
13 } // end of method Program::Main
  簡要解釋一下上述MSIL指令代碼:

  第06句給局部變量s分配一個索引號(索引號從0開始,如函數(shù)中有多個局部變量,其索引號按在函數(shù)中出現(xiàn)的順序加一)。

  在編譯時編譯器會將代碼中的兩個字串“a”和“abcd”寫入到程序集的元數(shù)據(jù)(metadata)中,此時,這兩個字串被稱為“字串字面量(string literal)”。

  第08句使用ldstr指令為字串對象“a”分配內(nèi)存,并將此對象引用壓入到線程堆棧中。

  第09句使用stloc指令從線程堆棧頂彈出先前壓入的對象引用,將其傳給局部變量s(其索引號為0)。

  同樣的過程對“abcd”重復(fù)進(jìn)行一次,所以這兩句簡單的代碼

    String s = "a";
s = "abcd";
  將會導(dǎo)致CLR使用ldstr指令分配兩次內(nèi)存。

  根據(jù)上述分析,讀者一定明白了String變量的內(nèi)容是只讀的,給其賦不同的值將會導(dǎo)致內(nèi)存的重新分配。因此,為提高程序性能,編程時應(yīng)盡量減少內(nèi)存的分配操作。

  下面對代碼中常見的字串用法進(jìn)行分析,從中讀者可以知道如何避免嚴(yán)重影響程序性能的字串操作。

  2、盡量少使用字串加法運算符

  請看以下兩段代碼:

  (1) String s1 = "ab";
s1+="cd";

  (2) String s1="ab"+"cd";

  這兩段代碼運行結(jié)果一樣,但速度一樣快嗎?

  請看第(1)段代碼生成的MSIL指令:

    .locals init ([0] string s1)
IL_0000: nop
IL_0001: ldstr "ab"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldstr "cd"
IL_000d: call string [mscorlib]System.String::Concat(string,
string)
IL_0012: stloc.0
IL_0013: ret
  再看第(2)段代碼生成的指令:

    .locals init ([0] string s1)
IL_0000: nop
IL_0001: ldstr "abcd"
IL_0006: stloc.0
IL_0007: ret
  可以很清楚地看到,第(1)段代碼將導(dǎo)致String類的Concat()方法被調(diào)用(實現(xiàn)字串加法運算)。對于第(2)段代碼,由于C#編譯器聰明地在編譯時直接將兩個字串合并為一個字串字面量,所以程序運行時CLR只調(diào)用一次ldstr指令就完成了所有工作,其執(zhí)行速度誰快就不言而喻了!

  3、避免使用加法運算符連接不同類型的數(shù)據(jù)

  請看以下代碼:

    String str = "100+100=" + 200;
Console.Writeline(str);
  生成的MSIL指令為:

    .maxstack 2
.locals init ([0] string str)
IL_0000: nop
IL_0001: ldstr "100+100="
IL_0006: ldc.i4 0xc8
IL_000b: box [mscorlib]System.Int32
IL_0010: call string [mscorlib]System.String::Concat(object,
object)
IL_0015: stloc.0
IL_0016: ldloc.0
IL_0017: call void [mscorlib]System.Console::WriteLine(string)
IL_001c: nop
IL_001d: ret
  可以清晰地看到,這兩句C#代碼不僅導(dǎo)致了String類的Concat()方法被調(diào)用(IL_0010),而且還引發(fā)了裝箱操作(IL_000b)!
Concat()方

下一頁
返回列表
返回首頁 主站蜘蛛池模板: 久久精品男人影院| 向日葵app在线观看免费下载视频| blacked欧美一区二区| 日产亚洲一区二区三区| 五月天在线婷婷| 欧美波霸影院在线观看| 免费播看30分钟大片| 老湿机香蕉久久久久久| 国产在线拍偷自揄拍无码| 在线观看免费视频资源| 在线播放无码高潮的视频| 一个人看的视频在线| 无码专区HEYZO色欲AV| 久久精品国产亚洲| 国产精品婷婷久青青原| 国产调教视频在线观看| h无遮挡男女激烈动态图| 成年女人免费视频播放77777| 久久精品国产69国产精品亚洲 | 国产精品视频网| a级毛片100部免费观看| 很黄很污的视频网站| 中文字幕色综合久久| 日本网址在线观看| 乱人伦精品视频在线观看| 欧美日韩色黄大片在线视频 | 老司机在线精品| 国内精品伊人久久久久AV一坑 | 日本xxx在线| 久久青草免费91线频观看不卡| 欧美军同性videosbest| 亚洲欧洲自拍拍偷午夜色| 特级无码a级毛片特黄| 国产在线jyzzjyzz免费麻豆| 欧美欧洲性色老头老妇| 国产精品伦子一区二区三区| 80s国产成年女人毛片| 尾野真知子日韩专区在线| 中文字幕永久免费| 无码夫の前で人妻を侵犯| 久久久久无码国产精品不卡|