const
用于修改字段或局部变量的声明。它指定字段或局部变量的值是常数,不能被修改。常量的值必须在编译的时候确定,编译后,CLR将常量的值保存在Assembly的怨数据中。如果变量是const,那么他隐式的是static的。因此在声明常数的时候只需将该变量声明为const即可,而不允许在声明常数的时候使用static。
当代码引用常量时,CLR在元数据中查找该符号,将提取的常量值嵌入到IL中,所以常量没有地址以及相应的分配内存,而且不能通过引用传递变量
readonly
在字段上使用的修饰符,表示该字段是只读的。当一个字段在声明为readonly的时候,只有两种方式可以对其赋值,即作为声明的一部分出现,或者在同一类的构造函数中。
对于实例字段,在包含字段声明的类的实例构造函数中;或者,对于静态字段,在包含字段声明的类的静态构造函数中。也只有在这些上下文中,将 readonly 字段作为 out 或 ref 参数传递才有效。
static
声明属于类型本身而不是属于特定对象的静态成员,可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。
尽管类的实例包含该类所有实例字段的单独副本,但每个静态字段只有一个副本
不能通过类的实例引用静态成员,只可以通过类型名称引用它
如果对类应用 static 关键字,则该类的所有成员都必须是静态的
类(包括静态类)可以有静态构造函数。在程序开始和实例化类之间的某个时刻调用静态构造函数
const和readonly
const
1. 在编译期间解析的常量
2. 必须在声明就初始化
3. 既可用来修饰类中的成员,也可修饰函数体内的局部变量。
readonly
1. 在运行期间解析的常量,
2. 既可以在声明时初始化也可以在构造器中初始化,因此根据使用的构造函数,readonly的字段可能具有不同的值。
3. 只可以用于修饰类中的成员
const和static readonly
都表示静态的常量,赋值以后都不可以更改。
参考资料: http://msdn2.microsoft.com/zh-cn/library/6tcf2h8w(VS.80).aspx