C 中的readonly跟const用法小結

2022-09-17 18:00:20 字數 1636 閱讀 5324

總結一下常量和唯讀欄位的區別:

由來:筆者也是在看歐立奇版的《.net 程式設計師面試寶典》的時候,才發現自己長久以來竟然在弄不清出兩者的情況下,混用了這麼長的時間。的確,const與readonly 很像,都是將變數宣告為唯讀,且在變數初始化後就不可改寫。那麼,const與readonly 這兩個修飾符到底區別在什麼地方呢?其實,這個牽扯出c#語言中兩種不同的常量型別:靜態常量(compile-time constants)和動態常量(runtime constants)。這兩者具有不同的特性,錯誤的使用不僅會損失效率,而且還會造成錯誤。

首先先解釋下什麼是靜態常量以及什麼是動態常量。靜態常量是指編譯器在編譯時候會對常量進行解析,並將常量的值替換成初始化的那個值。而動態常量的值則是在執行的那一刻才獲得的,編譯器編譯期間將其標示為唯讀常量,而不用常量的值代替,這樣動態常量不必在宣告的時候就初始化,而可以延遲到建構函式中初始化。

當你大致了解上面的兩個概念的時候,那麼就可以來說明const與readonly了。const修飾的常量是上述中的第一種,即靜態常量;而readonly則是第二種,即動態常量。那麼區別可以通過靜態常量與動態常量的特性來說明:

1)const修飾的常量在宣告的時候必須初始化;readonly修飾的常量則可以延遲到建構函式初始化 

2)const修飾的常量在編譯期間就被解析,即常量值被替換成初始化的值;readonly修飾的常量則延遲到執行的時候

此外const常量既可以宣告在類中也可以在函式體內,但是static readonly常量只能宣告在類中。

一.值的區別:

常量(const):是已知的,不能修改的值。const都是靜態的,不能使用static修飾。用類來訪問

唯讀字段(readonly):只能在建構函式中修改的,唯讀欄位的值不能在編譯時確定,而是在執行時確定的。

readonly可以用static修飾,也可以不用。

二.賦值方法區別:

常量(const):只能在宣告時賦值,常量的值在編譯時就已經確定,在程式中不能改變。

唯讀字段(readonly):唯讀字段可以在宣告時或者在建構函式內賦值。唯讀字段可以是靜態字段(乙個類只有乙個值),也可以是例項字段(每乙個例項有自己的值)。

const 定義的是靜態常在物件初始化的時候賦值.const修飾的常量必須在宣告的同時賦值,以後不能改變它的值.屬於編譯時常量。不能用new初始化。

const修飾的常量為靜態變數,不能夠為物件所獲取

readonly 是唯讀變數.屬於執行時變數.可以在類constructor裡改變它的值.不能作用於區域性變數。

(因此被readonly修飾的變數只能在初始化--宣告初始化或構造器初始化--的過程中賦值,其他地方不能進行對唯讀域的賦值操作)

readonly僅僅用於修飾class的field(字段)

public const int x = 10;

public const string a = "s";

public const user ca = null;

public readonly user canew = new user();

public readonly user animal;

protected static readonly datetime starttime;

readonly和const都是用來標識常量的。

C 中的readonly屬性

例如我們這裡有乙個類 class testclass2 public int showvalue 而在另乙個類中使用它 class testclass public void changetcvalue int value public void show tc.showvalue 我們看到雖然tc...

C 中 const 和 readonly 的區別

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

C 中 const 和 readonly 的區別

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