欄位VS常量

2022-02-10 07:04:39 字數 2741 閱讀 8913

常量和字段都是型別的資料成員,但是區別卻是很大的。

1. 常量的值永遠不會改變。欄位有多種型別,非唯讀欄位的值是可以改變的。

2. 常量的值必須在編譯時就確定,也就是說在定義時就要賦值。編譯後常量的值就儲存在程式集的元資料中;欄位是儲存在動態記憶體中,在執行時才能得到欄位的值。

3. 常量的定義必須用基元型別,關於基元型別可以參考(clr via c# 學習筆記(1) 基元型別 值型別 引用型別 );欄位的定義可以是任何型別。

4. 因為常量的值不能改變,可以將其看做是靜態型別,在il**中可以看到常量有static修飾符,所以在呼叫的時候和呼叫靜態字段一樣,直接用類名.常量名;欄位中的靜態欄位的呼叫才和常量一樣直接用類名.欄位名,呼叫非靜態字段必須用類的例項。、

5. c#不允許使用static修飾常量,因為常量本身就隱含是static型別;字段可以使用static,使用static定義的字段為靜態字段。

下面看個例子來理解下常量

1 建立乙個類庫專案命名為oec2003classlibrary ,在預設的類class1中寫如下**

namespace oec2003classlibrary

}

2 建立乙個web專案,新增對oec2003classlibrary類庫專案的引用,新建頁面consttest.aspx,在pageload中寫如下**

protected void page_load(object sender, eventargs e)

3 將consttest設為起始頁,執行,可以看到結果如下

4 現在將oec2003classlibrary 專案中的class1的**改寫如下,然後從新編譯該專案。

namespace oec2003classlibrary

}

5 重新整理剛才的頁面 ,可以看到結果如下

6 從新執行consttest頁面可以看到如下結果

從上面的例子可以看出,在應用程式不從新編譯的情況下,常量的值永遠不會發生改變。如果應用程式想要獲得常量的新值,就必須重新編譯,所以在執行時乙個應用程式集想獲得另乙個應用程式集中的值,則不能使用常量,可以使用唯讀字段(readonly)。

欄位也是一種型別的資料成員,欄位的修飾符有 static readonly volatile,沒有上述修飾修飾的字段為普通的例項字段。static可以和readonly一起使用,就是靜態唯讀字段。有關volatile將在後面的部分介紹。

關於readonly要注意的地方

l 1 當readonly修飾的字段為值型別時,在呼叫的時候如果檢視去改變欄位的值,將會編譯出錯。

l 2 當readonly修飾的字段為引用型別時,呼叫時不能改變其引用,但可以改變應用物件的值,看下面的例子。

1 在oec2003classlibrary專案的class1.cs檔案寫如下**

namespace oec2003classlibrary

public class

user

public string name }}

2 在web專案中新增頁面,命名為readonly.aspx,pageload**如下

protected void page_load(object sender, eventargs e)

從上面的講述中可以知道唯讀(readonly)字段一旦定義了是不能夠改變其值的,即使是引用型別也只能改變其引用物件的值。不過也並不是這麼絕對,下面就來看看怎樣用反射來實現改變唯讀欄位的值。

1 既然用到反射,首先引用命名空間using system.reflection; ,然後修改class1的**。

namespace oec2003classlibrary

public class

user

public string name }}

2 修改pageload中的**,將使用反射前的唯讀欄位的內容輸出。

protected void page_load(object sender, eventargs e)

結果如下

3 修改pageload的**,使用反射修改唯讀欄位的值然後輸出。

protected void page_load(object sender, eventargs e)

結果如下

呵呵,可以看出不管是值型別唯讀字段還是引用型別唯讀欄位都可以通過反射順利修改。

在一些面試中經常會遇到const和readonly的區別這樣的問題,歸根基地就是常量和字段的區別,readonly修飾的字段只是欄位的一種而已,實際應用中該選擇const還是readonly要根據實際的需求,const的效能要好,因為不用分配記憶體,不過限制很多,比如定義時型別的限制,顯得不是很靈活。

宣告:本文**自

常量字段定義

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

常量和字段

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

VS封裝字段

方法一 重構 先定義在封裝 選中欄位 點選右鍵 重構 封裝字段 快捷鍵ctrl r,e 方法二 使用propfull 邊定義邊封裝 輸入propfull 按兩次tab鍵 輸入資料型別 tab 設定欄位名 tab 設定屬性名 方法三 批量封裝 aseclipse是把eclispe一些方便的編輯功能移植...