• <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(運(yùn)行時(shí)常量)與const(編譯時(shí)常量),本文將就這兩種類型的不同特性進(jìn)行比較并說(shuō)明各自的適用場(chǎng)景。

            工作原理
                readonly為運(yùn)行時(shí)常量,程序運(yùn)行時(shí)進(jìn)行賦值,賦值完成后便無(wú)法更改,因此也有人稱其為只讀變量。
                const為編譯時(shí)常量,程序編譯時(shí)將對(duì)常量值進(jìn)行解析,并將所有常量引用替換為相應(yīng)值。
                下面聲明兩個(gè)常量:

            public static readonly int A = 2 ; // A為運(yùn)行時(shí)常量
            public const int B = 3 ; // B為編譯時(shí)常量

                 下面的表達(dá)式:

            int C = A + B;

                經(jīng)過(guò)編譯后與下面的形式等價(jià):

            int C = A + 3 ;

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

            聲明及初始化
                readonly常量只能聲明為類字段,支持實(shí)例類型或靜態(tài)類型,可以在聲明的同時(shí)初始化或者在構(gòu)造函數(shù)中進(jìn)行初始化,初始化完成后便無(wú)法更改。
                const常量除了可以聲明為類字段之外,還可以聲明為方法中的局部常量,默認(rèn)為靜態(tài)類型(無(wú)需用static修飾,否則將導(dǎo)致編譯錯(cuò)誤),但必須在聲明的同時(shí)完成初始化。

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

            public const DateTime D = DateTime.MinValue;

                改成readonly就可以正常編譯:

            public readonly DateTime D = DateTime.MinValue;


            可維護(hù)性
                readonly以引用方式進(jìn)行工作,某個(gè)常量更新后,所有引用該常量的地方均能得到更新后的值。
                const的情況要稍稍復(fù)雜些,特別是跨程序集調(diào)用:

            public class Class1
            {
                 public static readonly int A = 2 ; // A為運(yùn)行時(shí)常量
                 public const int B = 3 ; // B為編譯時(shí)常量
            }

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

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

                假設(shè)Class1與Class2位于兩個(gè)不同的程序集,現(xiàn)在更改Class1中的常量值:

            public class Class1
            {
                 public static readonly int A = 4 ; // A為運(yùn)行時(shí)常量
                 public const int B = 5 ; // B為編譯時(shí)常量
            }

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

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

                結(jié)果可能有點(diǎn)出乎意料,讓我們來(lái)仔細(xì)觀察變量C的賦值表達(dá)式:

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

                編譯后與下面的形式等價(jià):

            public static int C = Class1.A + 3 ;

                因此不管常量B的值如何變,對(duì)最終結(jié)果都不會(huì)產(chǎn)生影響。雖說(shuō)重新編譯Class2即可解決這個(gè)問(wèn)題,但至少讓我們看到了const可能帶來(lái)的維護(hù)問(wèn)題。

            性能比較
                const直接以字面量形式參與運(yùn)算,性能要略高于readonly,但對(duì)于一般應(yīng)用而言,這種性能上的差別可以說(shuō)是微乎其微

            posted on 2011-03-07 16:06 luis 閱讀(220) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久丫精品国产亚洲av不卡| 久久久久四虎国产精品| 久久99精品久久久久久| 亚洲精品美女久久久久99| 久久丫忘忧草产品| 亚洲国产日韩欧美综合久久| 久久国产精品免费一区二区三区| 91久久精一区二区三区大全| 久久精品国产影库免费看| 天天爽天天爽天天片a久久网| 国产精品午夜久久| 色欲综合久久躁天天躁| 欧美日韩精品久久久免费观看| 国产精品久久久久久五月尺| 久久香综合精品久久伊人| 性做久久久久久久| 国产精品久久国产精麻豆99网站| av无码久久久久不卡免费网站| 久久99精品国产麻豆宅宅| 欧美伊人久久大香线蕉综合69| 久久亚洲中文字幕精品一区| 国产AⅤ精品一区二区三区久久| 久久久久亚洲精品中文字幕| 久久天天婷婷五月俺也去| 少妇高潮惨叫久久久久久 | 久久综合丝袜日本网| 91久久精品无码一区二区毛片| 免费一级欧美大片久久网| 色婷婷久久综合中文久久蜜桃av| 色综合色天天久久婷婷基地| 四虎国产精品免费久久| 久久亚洲精品无码AV红樱桃| 精品国产91久久久久久久a | 伊人久久精品无码二区麻豆| 波多野结衣中文字幕久久| 久久久久亚洲AV无码专区网站| 国产成年无码久久久免费| 国产精品伊人久久伊人电影 | 老色鬼久久亚洲AV综合| 国产精品成人精品久久久| 久久精品国产亚洲AV不卡|