帶著問題讀CLR via C#(六)常量與欄位

來源:互聯網
上載者:User

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 ReadonlyTest13     {14         public static readonly char[] testChars = new char[] { 'A', 'B', 'C' };15     }

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.