帶着問題讀CLR via C#(六)常量與字段


Q1: const和readonly的區別是什么?

A1: const: const用來聲明常量。1)它的值必須在編譯時確定;2)編譯器將常量的值保存在程序集的元數據中;3)常量的值直接嵌入代碼,運行時不需要為常量分配內存空間;4)長兩宗被視為靜態成員;5)用const聲明的類型必須是基元類型; readonly: 用來聲明只讀字段。1)只讀字段只能在一個構造函數中寫入;2)可以用反射來修改readonly字段;3)當只讀字段為引用類型,不可改變的是引用,並非字段引用的對象。

 

Q2: 靜態字段和實例字段內存空間在什么時候分配?

A2: 靜態字段的內存空間在類型對象中分配,類型對象是在類型加載到一個AppDomain時創建的,換言之,通常是在引用了該類型的任何方法首次進行JIT編譯的時候;實例字段的內存空間在構造類型的一個實例時分配。

 

Q3: 字段修飾符有哪些?

A3: 1) static: 聲明靜態字段;2) readonly: 聲明只讀字段;3) volatile: 對於訪問這種字段的代碼,編譯器、CLR或硬件不會執行一些“線程不安全”的優化措施,能標記為volatile的類型有所有引用類型,Single, Boolean, Byte, SByte, Int16, Int32, UInt16, UInt32, Char, 以及基礎類型為 Byte, SByte, Int16, Int32, UInt16或UInt32的枚舉類型。4) 默認為實例字段。

 

Q4: 以下代碼中A,B,C,D四行代碼哪一行是錯的?

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             ReadonlyTest.testChars[0] = 'X';  // A
 6             ReadonlyTest.testChars[1] = 'Y';  // B
 7             ReadonlyTest.testChars[2] = 'Z';  // C
 8             ReadonlyTest.testChars = new char[] { 'X', 'Y', 'Z' };  // D
 9         }
10     }
11 
12     class ReadonlyTest
13     {
14         public static readonly char[] testChars = new char[] { 'A', 'B', 'C' };
15     }

A4: D行錯。A,B,C行修改的是testChars引用的對象,D修改的是testChars的引用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM