7.1 常量 常量 是值從不變化的符號。定義常量符號時,它的值必須能夠在編譯時確定。 只能定義編譯器識別的基元類型的常量,如果是非基元類型,需把值設為null。 常量的值直接嵌入代碼,所以不能獲取常量地址,不能以傳引用的方式傳遞常量。 不能很好地支持跨程式集的版本控制(修改一個DLL中的常量值,需要 ...
7.1 常量
- 常量 是值從不變化的符號。定義常量符號時,它的值必須能夠在編譯時確定。
- 只能定義編譯器識別的基元類型的常量,如果是非基元類型,需把值設為null。
- 常量的值直接嵌入代碼,所以不能獲取常量地址,不能以傳引用的方式傳遞常量。
- 不能很好地支持跨程式集的版本控制(修改一個DLL中的常量值,需要重新編譯所有引用該DLL的程式才可以)。
- 只有確定一個符號的值從不變化才應定義常量。
public sealed class SomeLibraryType
{
//註意:c#不允許為常量指定 static 關鍵字,
//因為常量總是隱式為 static
public const int MaxEntriesInList = 50;
}
7.2 欄位
欄位 是一種數據成員,其中容納了一個值類型的實例或者對一個引用類型的引用。
CLR術語 C#術語 說明 Static static 這種欄位是類型狀態的一部分,而不是對象狀態的一部分 Instance (預設) 這種欄位與類型的一個實例關聯,而不是與類型本身關聯 InitOnly readonly 這種欄位只能由一個構造器方法中的代碼寫入 Volatile volatile 編譯器、CLR和硬體不會對訪問這種欄位的代碼執行“線程不安全”的優化措施。只有以下類型才能標記為volatile:所有引用類型,Single,Boolean,Byte,SByte,Int16,UInt16,Int32,UInt32,Char,以及基礎類型為Byte,SByte,Int16,Uint16,Int32或UInt32的所有枚舉類型。 欄位被標記為 readonly 時,不可改變的是引用,而非欄位引用的對象 ,如:
public sealed class AType { //InvalidChars總是引用同一個數組對象 public static readonly char[] InvalidChars = new char[] { 'A', 'B', 'C' }; } public sealed class AnotherType { public static void M() { //下麵三行代碼是合法的,可以通過編譯,並可成功 //修改InvalidChars數組中的字元 AType.InvalidChars[0] = 'X'; AType.InvalidChars[1] = 'Y'; AType.InvalidChars[2] = 'Z'; //下一行代碼是非法的,無法通過編譯, //因為不能讓InvalidChars引用別的什麼東西 AType.InvalidChars = new char[] { 'X', 'Y', 'Z' }; } }