C 靜態常量和動態常量的區別

2021-08-20 05:06:13 字數 1356 閱讀 4252

c#擁有兩種不同的常量:靜態常量(compile-time constants)和動態常量(runtime  constants)。它們有不同的特性,錯誤的使用不僅會損失效率,還可能造成錯誤。相比之下,靜態常量在速度上會稍稍快一些,但是靈活性卻比動態常量差很多。 

//靜態常量(隱式是靜態的)

public const int  compiletimeconstant = 1;

//動態常量

public static readonly runtimeconstant =  1;

靜態常量在編譯時會將其替換為所對應的值,也就是說下面這2句話通過編譯器編譯後產生的il是一樣的。

//通過編譯後二者會被翻譯成相同的中間語言

int mynum =  compiletimeconstant;

int mynum = 1;

動態常量的值是在執行時獲得的。il中將其標為唯讀常量,而不是用常量的值代替。

靜態常量只能被宣告為簡單的資料型別(內建的int和浮點型)、列舉或字串。下面的程式段是通不過編譯的。你不能用new關鍵字初始化乙個靜態常量,即便是對乙個值型別來說。

//這樣是錯誤的

public const datetime mydatetime = new  datetime(2006,9,1,0,0,0);

//這樣是可以的

public static readonly datetime  mydatetime = new datetime(2006,9,1,0,0,0);

唯讀資料也是常量的一種,它們不能在構造器初始化之後被修改。但是它同靜態常量不同,它的值是在執行時才被指派的,因此就會獲得更大的靈活性。動態常量可以是任意的資料型別。

二者最大的差別在於:靜態常量在編譯時會將其換為對應的值,這就意味著對於不同的程式集來說,當你改變靜態常量的時候需要將其重新編譯,否則常量的值不會發生變化,可能引發潛在的問題,而動態常量就不會有這種情況。

用const定義的常量(隱式是靜態的),需要像訪問靜態成員那樣去訪問const定義的常量,而用物件的成員方式去訪問會出編譯錯誤。 宣告的同時要設定常量值。

從另一方面來說,如果你的確要宣告一些從不改變且處處唯一的常量,例如鉤子函式setwindowshookex的idhook引數或序列化時的版本等,就應該使用靜態常量。但是用到這樣的常量的機會不多。一般來說我們應該使用靈活性更高的動態常量。

靜態常量           動態常量

記憶體消耗        無                  因為要儲存常量 有消耗

初始化         很少的簡單型別,     任意型別,可以在類建構函式中賦值

不能new,必須在

宣告同時賦值

何時發揮作用  編譯時進行替換      相當於類中的資料成員

c 常量指標和指標常量區別

const double cptr 這裡的cptr是乙個指向double型別const物件的指標,const限定了cptr指標所指向的物件型別,而並非cptr本身。也就是說cptr本身並不是const。在定義時不需要對它進行初始化,如果需要的話,允許給cptr重新賦值,使其指向另乙個const物件。...

C 常量指標和指標常量的區別

首先是乙個常量,其次該常量是個指標。因為是乙個指標型別的常量,所以定義時必須初始化乙個變數的位址,且始終指向該位址不能被更改即只能賦值一次,但位址中存放的內容可以被更改。通過以下例子了解指標常量的特性 int a,b int const p a 指標常量初始化 p 10 操作成功,指標常量所指位址的...

C 靜態 常量

1 靜態成員變數 c 靜態成員變數是用static修飾的成員變數,不屬於物件的一部分,而是類一部分,因此可以在沒有例項化任何物件的時候使用靜態成員變數。但是 必須初始化它 由於靜態變數只能被初始化一次 所以初始化成員變數不要放在如下地方 1.類中函式之中 函式可被多次呼叫 2.類外函式之中 3.標頭...