带着问题读CLR via C#(六)常量与字段
Q1: const和readonly的區(qū)別是什么?
A1: const: const用來聲明常量。1)它的值必須在編譯時(shí)確定;2)編譯器將常量的值保存在程序集的元數(shù)據(jù)中;3)常量的值直接嵌入代碼,運(yùn)行時(shí)不需要為常量分配內(nèi)存空間;4)長(zhǎng)兩宗被視為靜態(tài)成員;5)用const聲明的類型必須是基元類型; readonly: 用來聲明只讀字段。1)只讀字段只能在一個(gè)構(gòu)造函數(shù)中寫入;2)可以用反射來修改readonly字段;3)當(dāng)只讀字段為引用類型,不可改變的是引用,并非字段引用的對(duì)象。
?
Q2: 靜態(tài)字段和實(shí)例字段內(nèi)存空間在什么時(shí)候分配?
A2: 靜態(tài)字段的內(nèi)存空間在類型對(duì)象中分配,類型對(duì)象是在類型加載到一個(gè)AppDomain時(shí)創(chuàng)建的,換言之,通常是在引用了該類型的任何方法首次進(jìn)行JIT編譯的時(shí)候;實(shí)例字段的內(nèi)存空間在構(gòu)造類型的一個(gè)實(shí)例時(shí)分配。
?
Q3: 字段修飾符有哪些?
A3: 1) static: 聲明靜態(tài)字段;2) readonly: 聲明只讀字段;3) volatile: 對(duì)于訪問這種字段的代碼,編譯器、CLR或硬件不會(huì)執(zhí)行一些“線程不安全”的優(yōu)化措施,能標(biāo)記為volatile的類型有所有引用類型,Single, Boolean, Byte, SByte, Int16, Int32, UInt16, UInt32, Char, 以及基礎(chǔ)類型為?Byte, SByte, Int16, Int32, UInt16或UInt32的枚舉類型。4) 默認(rèn)為實(shí)例字段。
?
Q4: 以下代碼中A,B,C,D四行代碼哪一行是錯(cuò)的?
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行錯(cuò)。A,B,C行修改的是testChars引用的對(duì)象,D修改的是testChars的引用。
轉(zhuǎn)載于:https://www.cnblogs.com/Allen-Li/archive/2013/04/11/3015443.html
總結(jié)
以上是生活随笔為你收集整理的带着问题读CLR via C#(六)常量与字段的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数组去重与数组扁平化
- 下一篇: 如何:重写 ToString 方法(C#