带着问题读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的引用。

posted @ 2013-04-11 21:23  Allen Li  阅读(1506)  评论(6编辑  收藏  举报