C 中const與readonly的區別之淺見

2021-07-25 23:16:53 字數 1285 閱讀 3762

之前在寫c#**時一直沒有認真思考過const與readonly的區別,都是用的比較隨意,只知道說這兩個關鍵字乙個是不變常量並且無法修改,乙個是唯讀不能進行寫操作。然後看過一些文章之後覺得之前理解的太片面,沒有深入理解。這裡把今天深入理解的記錄下來。

1.const是不變常量,在編譯的時候就需要有確定的值,只能用於數值和字串,或者引用型別只能為null.(這裡為什麼要把字串單獨拿出來?是因為字串string是引用型別,但是使用的時候卻感覺是值型別,它是一種特殊的引用型別,後面會詳細說),struct也不能用const標記。const可以修飾class的字段或者區域性變數,不能修飾屬性。而readonly僅僅用於修飾class的字段,不能修飾屬性。const是屬於類級別而不是例項物件級別,不能跟static一起使用。而readonly既可以是類級別也可以是例項級別,它可以與static一起使用。

2.readonly是唯讀的意思,表示不能進行寫操作。最重要的是它在程式執行時才會去求值。它可以是任意型別,當然可以是object,陣列,struct,它必須在建構函式或者初始化器中初始化,初始化完成之後不能被修改。通常可以定義乙個readonly值為datetime的常量。而const卻無法指定為datetime型別。

如下類裡面關於const和readonly的定義。

public class person

}

public const classa ca = new classa(){};是會報錯的。

華麗的分割線,下面說說上面說到的string的問題。string是引用型別,但是它是一種特殊的引用型別。

通常我們進行如下定義:

string a = "abc:;

string b = "abc";

console.writeline("result:" + object.referenceequals(a, b));

上面列印的結果是「result : true"。為什麼?這是因為a與b指向了同乙個instance.而這個instance就是string.intern("abc"),雖然a,b在記憶體中的位址不一樣,但是他們都指向了string.intern("abc").string是引用型別,定義a的時候賦值為abc,記憶體中如果沒有值等於abc的記憶體位址則分配乙個記憶體位址,並把值賦值為abc,下次定義b的時候發現有乙個值等於abc的位址,則把記憶體指向這個記憶體值為abc的記憶體。有點繞哈。總之記憶體之中只會儲存一種字串,如果定義的字串和記憶體中的一樣,則指過去。

有人這麼說:string是引用型別,只是編譯器做了特殊處理。

c中的const與c 中的const

c中的const是乙個偽唯讀識別符號。include include int main 此時輸出a的值為20,被指標間接的改變了。c 中,const進行了增強,不在是乙個偽識別符號了。const int a 10 int p int a p 20 cout a p endl cout a endl ...

c 中 const與指標

const與指標這塊自己一直理解的朦朦朧朧的,今天在vs上專門做個一些測試,特此記錄。const與指標一般有兩種情況 一是修飾指標指向的物件,二是用const修飾指標.如 int age 23 const int pt age int age 23 const int pt age int sage...

c與c 中const使用

c中可以修改const修飾的變數的值 區域性變數 int main 全域性變數 const int c 10 唯讀 int main c 中不可以修改const修飾的變數的值 區域性變數 int main 為什麼 p輸出的是11?原因 區域性變數 const int c其實是儲存在符號表中,無記憶體...