const
本地常量,一旦被初始化,值就不能改变
特征
- 常量在声明时必须初始化。
- 常量在声明后不能改变。
使用
语法与字段或变量声明相同
- 在类型之前增加关键字const。
- 必须有初始化语句。初始化值必须在编译期决定,通常是一个预定义简单类型或由其组成的表达式。它还可以是null引用,但它不能是某对象的引用,因为对象的引用是在运行时决定的。
关键字const不是一个修饰符,而是核心声明的一部分。它必须直接放在类型的前面。
语法
const int Identifer = 5;
readonly
概念
字段可以用readonly修饰符声明,作用与const一样,一旦值被设置就不能改变
规则
- const字段只能在字段的声明语句中初始化,而readonly字段可以在下列任意位置设置它的值。
- 字段声明语句,类似const。
- 类的任何构造函数。如果是static字段,初始化必须在静态构造函数中完成。
- const字段的值必须在编译时决定,而readonly字段的值可以在运行时决定。这种增加的自由性允许你在不同的环境或不同的构造函数中设置不同的值!
- 和const不同,const的行为总是静态的,而对于readonly字段以下两点是正确的。
- 它可以是实例字段,也可以是静态字段。
- 它在内存中有存储位置。
例
class Shape
{
readonly double PI = 3.1416;
readonly int NumberOfSides;
public Shape(double side1, double side2)
{
NumberOfSides = 4;
}
public Shape(double side1, double side2, double side3)
{
NumberOfSides = 3;
}
}
class Program
{
static void Main(string[] args)
{
Shape s = new Shape(2, 5);
Shape r = new Shape(2, 5, 8);
Console.WriteLine($"{s.NumberOfSides}");
Console.WriteLine($"{r.NumberOfSides}");
Console.ReadKey();
}
}
结果
4
3
分析
可以看到声明了readonly,可以在构造函数中重新赋值,但仅限于构造函数内
总结
\ | 静态常量(const) | 动态常量(readonly) |
---|---|---|
定义 | 声明的同时要设置常量值。 | 声明的时候可以不需要进行设置常量值,可以在类的构造函数中进行设置。 |
类型限制 | 只能修饰基元类型,枚举类型或者字符串类型。 | 没有限制,可以用它定义任何类型的常量。 |
对类对象而言 | 对于所有类的对象而言,常量的值是一样的。 | 对于类的不同对象而言,常量的值可以是不一样的。 |
内存消耗 | 无 | 要分配内存,保存常量实体。 |
综述 | 性能要略高,无内存开销,但是限制颇多,不灵活。 | 灵活,方便,但是性能略低,且有内存开销。 |