c#.Net.NetCore面试(六)readonly与const区别?

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。

原文链接:,转发请注明来源!