熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

在.NET程序中正確使用String類型[1]

2013-11-13 12:15:16  來源: .NET編程 
    在實際程序中String類型用得非常廣泛然而由於NET對String類型變量的獨特管理方式使用不當會嚴重影響程序的性能我們分幾個方面來談這個問題

  了解String數據的內存分配方式

  編寫一個控制台應用程序輸入以下測試代碼

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

method private hidebysig static void Main(string[] args) cil managed
{
entrypoint
// 代碼大小 (xe)
maxstack
locals init ([] string s)
IL_: nop
IL_: ldstr a
IL_: stloc
IL_: ldstr abcd
IL_c: stloc
IL_d: ret
} // end of method Program::Main
  簡要解釋一下上述MSIL指令代碼

  第句給局部變量s分配一個索引號(索引號從開始如函數中有多個局部變量其索引號按在函數中出現的順序加一)

  在編譯時編譯器會將代碼中的兩個字串aabcd寫入到程序集的元數據(metadata)中此時這兩個字串被稱為字串字面量(string literal)

  第句使用ldstr指令為字串對象a分配內存並將此對象引用壓入到線程堆棧中

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

  同樣的過程對abcd重復進行一次所以這兩句簡單的代碼

String s = a;
s = abcd;
  將會導致CLR使用ldstr指令分配兩次內存

  根據上述分析讀者一定明白了String變量的內容是只讀的給其賦不同的值將會導致內存的重新分配因此為提高程序性能編程時應盡量減少內存的分配操作

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

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

  請看以下兩段代碼

  () String s = ab;
s+=cd;

  () String s=ab+cd

  這兩段代碼運行結果一樣但速度一樣快嗎?

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

locals init ([] string s)
IL_: nop
IL_: ldstr ab
IL_: stloc
IL_: ldloc
IL_: ldstr cd
IL_d: call string [mscorlib]SystemString::Concat(string
string)
IL_: stloc
IL_: ret    

[]  []  


From:http://tw.wingwit.com/Article/program/net/201311/15505.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.