十八 常量和字段

2022-01-30 21:13:27 字數 1560 閱讀 7237

常量就是定義完以後就永遠不會再改變的符號,它的值是在編譯時必須確定的,編譯通過後,編譯器將常量的值儲存在程式集的元資料中,定義常量將導致元資料的產生,常量只能是基元型別。 

因為常量的值不會被改變,所以可以說常量是型別的一部分,而不是例項成員的,是靜態的。

當**引用乙個常量符號時,編譯器將在定義常量的程式集的元資料中查詢該符號,提取常量的值,並將值嵌入到編譯後生成的il**中。因為常量的值在編譯時就直接嵌入**,所以執行時就不需要為常量分配任何記憶體,也不能得到常量的位址,不能通過引用來傳遞常量。

這些特徵說明常量沒有很好的跨程式集版本控制特徵,所以常量只能用於確定某符號的值永遠不會改變時。

看以下**:

先在vs2005中建立乙個解決方案,新增乙個類庫,在該增加下面這個型別somelibrarytype.cs

using

system;

public

sealed

class

somelibrarytype

在新增乙個控制台應用程式,該專案引用上面建立的類庫,在該專案裡新增這個型別program.cs

using

system;

public

sealed

class

program

}注意,program.cs程式**中引用的常量testconst是在somelibrarytype類中定義的,當編譯器構建程式**時,它知道testconst是個常量符號,

其值為100,並將該值嵌入到應用程式的il**中,如下:

當應用程式構建以後,就不需要在敵對行動時載入textconst所在的類庫的dll程式集了,如果將testconst改為200,並重新單獨構建dll程式集或是應用程式集該常量值都不會得到影響,只有重新全部都進行編譯。

以上可以看出使用常量帶來的版本控制的問題。

字段是一種資料成員,存放著值型別的例項或者引用型別的引用。

clr支援靜態字段(型別的)和非靜態字段(例項的),對於型別字段,存放字段資料所需要的動態記憶體是在型別物件內部分配的,而動態記憶體是在型別載入到應用程式域時建立的,也就是說在首次引用型別時才建立的動態記憶體,就是jit編譯,對於例項字段,建立型別例項時才分配存放欄位的動態記憶體。因為欄位是儲存在動態記憶體中的,所以只有在執行時才可以得到欄位的值。字段可以解決常量存在的版本控制問題。字段可以是任何資料型別,不像常量那樣只有基元型別。

字段還有唯讀欄位和讀寫字段,讀寫字段說明在執行**過程中可以多次改變欄位的值,但是唯讀字段只能在構造器方法中寫入數值,稱之為一次寫,編譯器和驗證機制確保唯讀字段不能被構造器以外的任何其它方法寫入。

利用上面常量的程式,把類庫中的程式改成用唯讀欄位來實現:

using

system;

public

sealed

class

somelibrarytype

在程式編譯完執行後,假設我們修改乙個testconst的值為200,重新生成類庫的程式集,當應用程式**重新執行時,他會自動去提取新值200,應用程式集不需要重新編譯。檢視應用程式集的il**,可以看到沒有像常量一樣的裡面嵌入值100。

常量和字段

定義常量符號時,它的值必須能在編譯時確定。確定之後,編譯器將常量的值儲存到程式集的元資料中。這意味著只能為編譯器認定的基元型別定義常量。在c 中,以下型別都是基元型別,可以定義常量 boolean char byte sbyte int16 uint16 int32 uint32 int64 uin...

CLR via C 常量,欄位和方法

常量 具有以下特性 1.c 允許定義基元型別常量,也允許定義非基元型別常量 值必須為null 2.常量被視為靜態成員 不能用static修飾 而不是例項成員。3.常量的指向和值都不允許被修改。字段 具有以下特性 1.c 允許定義任何資料型別的字段。常用的字段修飾符如下表所示 clr術語 c 術語 說...

常量字段定義

隱含為static 必須在宣告時初始化 必須被初始化為編譯時常量值 只有簡單型別,列舉,字串才可以是常量 常量字段 class pair private const int x 0,y 0 解析 在c 中,常量字段隱含為static,但你不能顯式宣告乙個常量欄位是static static cons...