• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 在.NET程序中正確使用String類型[1]

    發表于:2007-05-17來源:作者:點擊數: 標簽:程序.NETString類型正確
    在實際程序中,String類型用得非常廣泛,然而,由于 .NET 對String類型變量的獨特管理方式,使用不當,會嚴重影響程序的 性能 。我們分幾個方面來談這個問題: 1、了解String數據的內存分配方式 編寫一個控制臺應用程序,輸入以下 測試 代碼: class Program
        在實際程序中,String類型用得非常廣泛,然而,由于 .NET對String類型變量的獨特管理方式,使用不當,會嚴重影響程序的性能。我們分幾個方面來談這個問題:

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

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

    clearcase/" target="_blank" >cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    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開始,如函數中有多個局部變量,其索引號按在函數中出現的順序加一)。

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

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

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

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

    String s = "a";
    s = "abcd";

      將會導致CLR使用ldstr指令分配兩次內存。

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

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

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

      請看以下兩段代碼:

     ?。?) String s1 = "ab";
    s1+="cd";

     ?。?) String s1="ab"+"cd";

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

      請看第(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
        

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>