第八章 常数与字段
一.常数(const)
定义一个常数时,我们必须能够在编译时确定它的值.通过编译后,编译器将常数的值保存在其所定义模块的元数据内.这意味着常数的类型只能是那些编译器认为的基元类型。(c#中,下面的类型可以称为基元类型, Boolean.char.byte,sbyte,decimal,int16,uint16,int32,uint32,int64,uint64,single,double以及string,枚举类型由于本身以基元类型形式存储,故也可以被用来定义常数,但它不是基元类型)
只有基元类型的数据成员在编译时直接进行初始化.而非基元类型的数据成员只能在运行时调用构造器来完成初始化.
常数在运行时不再需要任何的内存分配.也不能获取常数的地址,
二.字段(readonly)
字段保存一个值类型的实例,或一个指向引用类型的引用.在该类型被加载进入一个应用程序时为其分配动态内存.
因为字段是以动态内存的形式存储的.因此只能在运行时刻获取他们的值,
有只读字段和读写字段两种.
只读字段只能在构造器内被赋值(构造器在对象初次创建时被执行,且只执行一次).对于静态只读字段,则只能在静态构造器内赋值.

Code
1
2
class SomeType
3
{
4
//一个静态只读字段,它的值将在运行时
5
//类被初始化时计算并存储在内存中
6
public static readonly Random random = new Random();
7
8
//一个静态读写字段
9
static int numberofWrites = 0;
10
11
//一个实例只读字段
12
public readonly string pathName = "untitled";
13
14
//一个实例读写字段
15
public System.IO.FileStream fs;
16
17
public SomeType(string pathName)
18
{
19
//该行修改只读字段pathName
20
//因为是在构造器中,所以可以
21
this.pathName = pathName;
22
}
23
24
public String DoSomeThing()
25
{
26
//该行首先读取静态读写字段,然后又被赋值
27
numberofWrites = numberofWrites + 1;
28
29
//该行读取实例只读字段
30
return pathName;
31
}