国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#中的readonly與const

2019-11-17 03:02:32
字體:
來源:轉載
供稿:網友

C#中的readonly與const

比較C#中的readonly與const

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

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

publicstaticreadonlyintA=2;//A為運行時常量publicconstintB=3;//B為編譯時常量

下面的表達式:

intC=A+B;

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

intC=A+3;

可以看到,其中的const常量B被替換成字面量3,而readonly常量A則保持引用方式。聲明及初始化readonly常量只能聲明為類字段,支持實例類型或靜態類型,可以在聲明的同時初始化或者在構造函數中進行初始化,初始化完成后便無法更改。 const常量除了可以聲明為類字段之外,還可以聲明為方法中的局部常量,默認為靜態類型(無需用static修飾,否則將導致編譯錯誤),但必須在聲明的同時完成初始化。數據類型支持 由于const常量在編譯時將被替換為字面量,使得其取值類型受到了一定限制。const常量只能被賦予數字(整數、浮點數)、字符串以及枚舉類型。下面的代碼無法通過編譯:

publicconstDateTime D=DateTime.MinValue;

改成readonly就可以正常編譯:

publicreadonlyDateTime D=DateTime.MinValue;

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

publicclassClass1{publicstaticreadonlyintA=2;//A為運行時常量publicconstintB=3;//B為編譯時常量}publicclassClass2{publicstaticintC=Class1.A+Class1.B;//變量C的值為A、B之和}Console.WriteLine(Class2.C);//輸出"5"

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

publicclassClass1{publicstaticreadonlyintA=4;//A為運行時常量publicconstintB=5;//B為編譯時常量}

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

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

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

publicstaticintC=Class1.A+Class1.B;

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

publicstaticintC=Class1.A+3;

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

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

適用場景 在下面兩種情況下: a.取值永久不變(比如圓周率、一天包含的小時數、地球的半徑等) b.對程序性能要求非??量?可以使用const常量,除此之外的其他情況都應該優先采用readonly常量。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贡嘎县| 靖边县| 松桃| 德兴市| 固原市| 西城区| 迁安市| 天津市| 林西县| 彰武县| 邯郸县| 南投市| 象山县| 安平县| 石嘴山市| 海丰县| 南岸区| 马边| 攀枝花市| 延寿县| 眉山市| 伊通| 崇明县| 胶南市| 宜城市| 江津市| 平安县| 手机| 开原市| 潼关县| 商城县| 洛宁县| 宁武县| 东兴市| 江源县| 遂川县| 山东省| 门头沟区| 义马市| 湛江市| 兖州市|