const、readonly和static
const
用于修改字段或局部变量的声明。它指定字段或局部变量的值不能被修改。常数声明引入给定类型的一个或多个常数。
备注:
常数声明可以声明多个常数,例如:
public const double x = 1.0, y = 2.0, z = 3.0;
不允许在常数声明中使用 static 修饰符。隐式地为静态的
只能在声明中赋值,且只能是常数或常数表达式,例如:
public const int c1 = 5.0;
public const int c2 = c1 + 100;
readonly 关键字是可以在字段上使用的修饰符。当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分发生,或者发生在同一类的构造函数中。
只能在下列上下文中进行只读字段的赋值:
当在声明中初始化变量时,例如:
public readonly int y = 5;
对于实例字段,在包含字段声明的类的实例构造函数中;或者,对于静态字段,在包含字段声明的类的静态构造函数中。只有在这些上下文中时,将 readonly 字段传递为 out 或 ref 参数才有效。
Const 与 readonly的区别:
const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值
const 字段是编译时常数,readonly 字段可用于运行时常数,如下例所示:
public static readonly uint l1 = (uint) DateTime.Now.Ticks;
const 不能与static一起始用,而readonly可以。
使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类型(2.0中可以)。
备注:
(1)常数隐式地是静态成员。
(2)不能通过实例引用静态成员。只可以通过类型名称引用它。例如,请考虑以下类:
public class MyBaseC
{
public struct MyStruct {
public static int x = 100;
}
}
若要引用静态成员 x,请使用完全限定名(除非可从相同范围访问):
MyBaseC.MyStruct.x
(3)每个静态字段只有一个副本,不管有多少个类的实例,它们共享一个副本。
(4)不可以使用 this 引用静态方法或属性访问器。 因为没有this指针。