c#.Net.NetCore面试(六)readonly与const区别?
readonly关键字(运行时常量):字段可以在声明或构造函数中初始化,常作为运行时常量使用。
const关键字(编译时常量):字段只能在该字段的声明时初始化,常作为编译时常量使用过。
在C#中,readonly和const关键字都用于创建在程序运行期间不会改变的值,但它们在使用方式和适用场景上有一些重要的区别。
编译时常量 (const)
const 关键字用于定义编译时常量,这意味着这些常量的值必须在编译时就能确定,并且必须是编译时常量表达式的一部分。
const 字段必须在声明时初始化。
const 字段只能是静态的(static),因为它们的值必须在编译时确定,这要求它们不依赖于任何对象实例的状态。
const 字段可以是值类型(如 int, double, struct 等)或引用类型(如 string),但如果是引用类型,则它必须是字符串字面量或null。
示例:
public class MyClass
{
public const int MyConstant = 10; // 编译时常量,必须在声明时初始化,且为静态
public const string MyStringConstant = "Hello, World!"; // 只能是字符串字面量或null
}
运行时只读字段 (readonly)
readonly 关键字用于定义运行时只读字段,这些字段的值可以在构造函数中设置,但设置后就不能再改变。
readonly 字段可以在声明时初始化,或者在构造函数中通过赋值语句初始化。
readonly 字段可以是静态的或非静态的。
readonly 字段可以是任何类型的值类型或引用类型。
示例:
public class MyClass
{
public readonly int MyReadOnlyField; // 运行时只读字段,可以在构造函数中初始化
public MyClass(int value)
{
MyReadOnlyField = value; // 只能在构造函数中赋值
}
}
总结一下关键区别:
const 是编译时常量,其值在编译时确定且不可更改,必须是静态的,且引用类型只能是字符串字面量或null。
readonly 是运行时只读字段,其值可以在构造函数中设置,之后不可更改,可以是静态的或非静态的,且可以是任何类型的值或引用。
选择使用 const 还是 readonly 应根据字段的用途和是否需要在运行时进行初始化来决定。如果你需要一个值在编译时就已知且不会改变,并且这个值不依赖于对象实例的状态,那么应该使用 const。如果你需要一个在运行时初始化后就不会改变的值,那么应该使用 readonly。