在C#中,const
和readonly
是用于定义常量和只读字段的关键字,它们有不同的用途和行为。以下是它们的主要区别:
1. 定义方式和初始化
-
const
:- 用于定义编译时常量。
- 必须在声明时初始化。
- 只能用于基本类型(如数字、字符、字符串等)和枚举。
- 在编译时就确定了值,无法在运行时更改。
public const int MyConst = 10;
-
readonly
:- 用于定义运行时常量。
- 可以在声明时初始化,也可以在构造函数中初始化。
- 可以用于任何类型,包括基本类型、对象和结构体。
- 在运行时初始化后,值不能再改变。
public readonly int MyReadonly; public MyClass(int value) { MyReadonly = value; // 只能在构造函数中初始化 }
2. 使用场景
-
const
:- 适用于那些在编译时就已知且不会更改的值。
- 由于值在编译时已经确定,
const
常量实际上被内联到代码中,这意味着所有引用const
的地方都直接使用这个值。
-
readonly
:- 适用于那些在运行时才能确定的值,或者需要在构造函数中根据不同的条件进行初始化的值。
- 可以使用
readonly
来定义复杂类型的不可变实例,比如一个配置对象或一个不可变的集合。
3. 语法和修饰符
-
const
:- 只能修饰字段(包括类字段和局部字段)。
- 隐式是
static
的,因此不能用于实例字段。 - 不能与
static
关键字一起使用,因为const
字段已经是静态的。
-
readonly
:- 可以修饰字段(包括实例字段和静态字段)。
- 可以与
static
关键字一起使用来定义静态只读字段。
public static readonly int MyStaticReadonly = 20;
4. 示例
以下是一个示例,展示了const
和readonly
的使用:
public class Example { public const int ConstValue = 10; public readonly int ReadonlyValue; public static readonly int StaticReadonlyValue = 20; public Example(int value) { ReadonlyValue = value; // 在构造函数中初始化 } }
在这个示例中:
ConstValue
是一个编译时常量,必须在声明时初始化,值不能改变。ReadonlyValue
是一个实例字段,可以在声明时或构造函数中初始化,初始化后不能改变。StaticReadonlyValue
是一个静态只读字段,可以在声明时或静态构造函数中初始化,初始化后不能改变。
总结起来,const
适用于编译时常量,而readonly
适用于运行时常量或需要在构造函数中初始化的值。