Chapter7 常量和字段

2022-02-05 03:09:09 字數 1919 閱讀 8548

常量(constant)是乙個特殊的符號,它有乙個從不變化的值,定義常量符號時,它的值必須能在編譯時確定,確定之後,編譯器將常量的值儲存到程式集的元資料中。

這意味著只能為編譯器認定的基元型別定義常量,也可以是非基元型別,但必須是null。

所以**在引用乙個常量符號時,不需要為常量分配任何記憶體,編譯器會在元資料中提取常量值,嵌入的il**中。

除此之外,不能獲取常量的位址,也不能按引用的方式傳遞常量。

這些限制意味著,常量沒有很好的跨程式集版本特性 ,如果希望在執行時從乙個程式集中提取另乙個程式集中的值,那麼不應該使用常量,而應該使用readonly欄位

下面舉個例子

將以下**編譯乙個dll程式集(假定這個dll程式集沒有進行強命名)

using

system;

namespace

classlibrary

}

1.開啟cmd->輸入命令cd c:\windows\microsoft.net\framework\v4.0.30319 進入framework4.0的安裝目錄(不同機器可能安裝路徑不一樣,也可以使用vs自帶的命令列提示工具)。

2.將sometype型別的**原始檔複製到上面目錄,然後執行命令列:csc /target:library sometype.cs,(csc.exe會預設reference mscorlib.dll程式集)然後會生成乙個sometype.dll。

3.接著用下面**生成乙個應用程式程式集:

using

system;

namespace

}}

4.將包含上面**的原始檔複製到同樣的目錄下,執行命令列:csc /out:main.exe /target:exe /r:sometype.dll program.cs,然後生成乙個main.exe的應用程式

執行main.exe

結果:const value:50

readonly value:50

5.現在把sometype中的值改為:

public

const int32 constvalue = 100

;public

static

readonly int32 readonlyvalue = 100;

重新編譯sometype.dll,然後在執行main.exe

結果:const value:50

readonly value:100

顯然常量的值沒有變,所以常量沒有很好的跨程式集版本特性

clr支援readonly欄位和read/write欄位,但大多是都是read/write欄位(欄位的值可多次改變),但是readonly欄位只能在乙個構造器方法中寫入

//

這是乙個靜態readonly欄位,在執行時對這個型別進行初始化,它的值會被計算並儲存到記憶體中

public

static

readonly random s_random = new

random();

//這是個靜態read/write欄位

private

static int32 s_numberofwrites=0;//

這是乙個例項readonly欄位

public

readonly string pathname = "

unitled";

//這是個例項read/write欄位

private

system.io.filestream m_fs;

public

sometype(string pathname)

public

string dosomething()

上面許多欄位都是內聯初始化,這只是c#語法的一種簡化,實際上還是在構造器中初始化。

chapter7 壓縮列表

壓縮列表 ziplist 是列表鍵和雜湊鍵的底層實現之一。當乙個列表鍵只包含少量列表鍵,並且每個列表項要麼就是小整數值,要麼就是長度比較短的字串,那麼redis就會使用壓縮列表來做列表鍵的底層實現。另外,當乙個雜湊鍵只包含少量鍵值對,並且每個鍵值對的鍵和值要麼就是小整數值,要麼就是長度比較短的字串,...

chapter7 管理使用者和性

第7章 管理使用者和安全性 目的 您必須建立使用者帳戶並授予那些帳戶相應的訪問許可權,以使使用者能夠訪問您的資料庫。某些使用者帳戶自動包括在預先配置的資料庫中,但是出於安全性的原因,這些帳戶中的大多數都是被鎖定的或過期的。在本章,您將學到如何建立和 管理使用者帳戶。您將使用enterpriseman...

Chapter7 模板方法模式

模板方法模式 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。既然用了繼承,並且肯定這個繼承有意義,就應該要成為子類的模板,所有重複的 都應該要上公升到父類去,而不是讓每個子類都去重複。當我們要完成在某一細節層次一致...