• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 195,  comments - 30,  trackbacks - 0

            原文地址:http://tech.e800.com.cn/articles/2009/62/1243906342108_1.html

            C#中有兩種常量類型,分別為readonly(運行時常量)與const(編譯時常量),本文將就這兩種類型的不同特性進行比較并說明各自的適用場景。

            工作原理
                readonly為運行時常量,程序運行時進行賦值,賦值完成后便無法更改,因此也有人稱其為只讀變量。
                const為編譯時常量,程序編譯時將對常量值進行解析,并將所有常量引用替換為相應值。
                下面聲明兩個常量:

            public static readonly int A = 2 ; // A為運行時常量
            public const int B = 3 ; // B為編譯時常量

                 下面的表達式:

            int C = A + B;

                經過編譯后與下面的形式等價:

            int C = A + 3 ;

                可以看到,其中的const常量B被替換成字面量3,而readonly常量A則保持引用方式。

            聲明及初始化
                readonly常量只能聲明為類字段,支持實例類型或靜態類型,可以在聲明的同時初始化或者在構造函數中進行初始化,初始化完成后便無法更改。
                const常量除了可以聲明為類字段之外,還可以聲明為方法中的局部常量,默認為靜態類型(無需用static修飾,否則將導致編譯錯誤),但必須在聲明的同時完成初始化。

            數據類型支持
                由于const常量在編譯時將被替換為字面量,使得其取值類型受到了一定限制。const常量只能被賦予數字(整數、浮點數)、字符串以及枚舉類型。下面的代碼無法通過編譯:

            public const DateTime D = DateTime.MinValue;

                改成readonly就可以正常編譯:

            public readonly DateTime D = DateTime.MinValue;


            可維護性
                readonly以引用方式進行工作,某個常量更新后,所有引用該常量的地方均能得到更新后的值。
                const的情況要稍稍復雜些,特別是跨程序集調用:

            public class Class1
            {
                 public static readonly int A = 2 ; // A為運行時常量
                 public const int B = 3 ; // B為編譯時常量
            }

            public class Class2
            {
                 public static int C = Class1.A + Class1.B; // 變量C的值為A、B之和
            }

            Console.WriteLine(Class2.C); // 輸出"5"

                假設Class1與Class2位于兩個不同的程序集,現在更改Class1中的常量值:

            public class Class1
            {
                 public static readonly int A = 4 ; // A為運行時常量
                 public const int B = 5 ; // B為編譯時常量
            }

                編譯Class1并部署(注意:這時并沒有重新編譯Class2),再次查看變量C的值:

            Console.WriteLine(Class2.C); // 輸出"7"

                結果可能有點出乎意料,讓我們來仔細觀察變量C的賦值表達式:

            public static int C = Class1.A + Class1.B;

                編譯后與下面的形式等價:

            public static int C = Class1.A + 3 ;

                因此不管常量B的值如何變,對最終結果都不會產生影響。雖說重新編譯Class2即可解決這個問題,但至少讓我們看到了const可能帶來的維護問題。

            性能比較
                const直接以字面量形式參與運算,性能要略高于readonly,但對于一般應用而言,這種性能上的差別可以說是微乎其微

            posted on 2011-03-07 16:06 luis 閱讀(223) 評論(0)  編輯 收藏 引用
            <2011年3月>
            272812345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            中文字幕精品无码久久久久久3D日动漫| 色综合久久久久综合体桃花网 | 国产午夜精品理论片久久影视| 久久免费的精品国产V∧| 国产精品热久久无码av| 伊人久久大香线蕉成人| 久久综合九色综合97_久久久| 久久精品无码av| 国产精品久久久久9999高清| 香蕉aa三级久久毛片| 狠狠久久亚洲欧美专区| 狠狠色综合网站久久久久久久高清| 免费国产99久久久香蕉| 97精品依人久久久大香线蕉97| 久久久久久久综合综合狠狠| 欧美大香线蕉线伊人久久| 色婷婷久久久SWAG精品| 夜夜亚洲天天久久| 国产精品久久亚洲不卡动漫| 99久久国产宗和精品1上映 | 久久99国产精品一区二区| 久久久久亚洲AV无码观看| 国产精品午夜久久| 久久免费高清视频| 国产精品久久久久久久久免费| 亚洲人成伊人成综合网久久久| 四虎影视久久久免费| 久久亚洲中文字幕精品一区四| 丁香狠狠色婷婷久久综合| 久久精品国产99久久无毒不卡| 99久久精品免费看国产一区二区三区 | 国产成人精品白浆久久69| 婷婷久久香蕉五月综合加勒比| 精品久久久无码人妻中文字幕| 91麻豆国产精品91久久久| 漂亮人妻被中出中文字幕久久| 日韩精品久久久久久久电影| 久久久久久伊人高潮影院| 蜜臀av性久久久久蜜臀aⅴ| 亚洲国产美女精品久久久久∴ | 亚洲国产成人久久精品动漫|