readonly 和const的區別

2021-04-12 22:56:54 字數 2231 閱讀 5316

const 的概念就是乙個包含不能修改的值的變數。

常數表示式是在編譯時可被完全計算的表示式。因此不能從乙個變數中提取的值來初始化常量。

如果 const int a = b+1;

b是乙個變數,顯然不能再編譯時就計算出結果,所以常量是不可以用變數來初始化的。

readonly 允許把乙個字段設定成常量,但可以執行一些運算,可以確定它的初始值。

因為 readonly 是在計算時執行的,當然它可以用某些變數初始化。

readonly 是例項成員,所以不同的例項可以有不同的常量值,這使readonly更靈活。

readonly 關鍵字與 const 關鍵字不同。

1. const 字段只能在該字段的宣告中初始化。

readonly 字段可以在宣告或建構函式中初始化。因此,根據所使用的建構函式,readonly 字段可能具有不同的值。

2. const 欄位是編譯時常數,而

readonly 欄位可用於執行時常數。

3. const 預設就是靜態的,而

readonly 如果設定成靜態的就必須顯示宣告。 4.

const 對於引用型別的常數,可能的值只能是

string 和

null。

readonly可以是任何型別

*需要注意的乙個問題是:

對於乙個 readonly 的 reference 型別,只是被限定不能進行賦值(寫)操作而已。而對其成員的讀寫仍然是不受限制的。 (經常說建議不要宣告readonly的陣列或物件)

public static readonly class1 my = new class1();

…my.someproperty = 10;

//正常

my = new class1(); //出錯,該物件是唯讀的

但是,如果上例中的 class1 不是乙個 class 而是乙個 struct,那麼後面的兩個語句就都會出錯。

const和readonly的值一旦初始化則都不再可以改寫;

const只能在宣告時初始化;readonly既可以在宣告時初始化也可以在構造器中初始化;

const隱含static,不可以再寫static const;readonly則不預設static,如需要可以寫static readonly;

const是編譯期靜態解析的常量(因此其表示式必須在編譯時就可以求值);readonly則是執行期動態解析的常量;

const既可用來修飾類中的成員,也可修飾函式體內的區域性變數;readonly只可以用於修飾類中的成員(updated:謝謝microhelper的提醒!)。

前面幾條也沒什麼可說的,不過關於這第4條,裡面還是有些文章可做的。試試下面的例子,看看是否與你所想一致吧!

顯示全部

0. 常量與靜態唯讀變數類庫(檔名consts.cs

public

class consts

執行csc /t:library consts.cs編譯輸出consts.dll

1. 客戶端(檔名quiz.cs,編譯選項/r:consts.dll

public

class quiz}

執行csc quiz.cs編譯輸出quiz.exe.

2. 執行quiz.exe,輸出如下:

const

readonly

3. 現在把consts.cs裡面的兩個常量的值都換成大寫並重新編譯consts.csquiz.exe不變,仍是引用consts.dll)。再執行quiz.exe

輸出:const

readonly

const在編譯quiz.cs時就靜態鏈結到exe檔案中了。

而readonly則在每次執行quiz.exe時呼叫consts.dll才解析生成。

const 和 readonly 的區別

const 和 readonly 的區別,總是不太清楚,於是查了查資料。const 的概念就是乙個包含不能修改的值的變數。常數表示式是在編譯時可被完全計算的表示式。因此不能從乙個變數中提取的值來初始化常量。如果 const int a b 1 b是乙個變數,顯然不能再編譯時就計算出結果,所以常量是不...

Const和ReadOnly的區別

1.const 和readonly 都是用來表示常量的。2.初始化賦值不同 a const 必須在宣告的時候即賦值。b readonly 可以在初始化的過程中賦值。在其他地方賦值,編譯器會報錯。因此,根據所使用的建構函式,readonly 字段可以具有不同的值。3.const 是編譯時常數,而 re...

const和readonly的區別

這同樣是乙個面試的基礎題。可以看看學習下哦 readonly關鍵字與const關鍵字的區別 1 const字段只能在該字段的宣告中初始化。readonly字段可以在宣告或建構函式中初始化。因此,根據所使用的建構函式,readonly字段可能具有不同的值。2 const欄位是編譯時常數,而readon...