在C#中常量和只读之间有什么区别?

你什么时候会用一个代替另一个?


当前回答

我们办公室的一名团队成员就何时使用常量、静态和只读提供了以下指导:

当您有一个在运行时可以知道的类型的变量(string literal、int、double、enums…),您希望类的所有实例或使用者都可以访问值不应更改的位置时,请使用const。如果您希望类的所有实例或使用者都可以访问值可以更改的数据,请使用静态。当您有一个在运行时无法知道的类型的变量(对象),您希望类的所有实例或使用者都可以访问值不应更改的位置时,请使用静态只读。当您有一个实例级变量时,您将在创建对象时知道该变量不应更改,请使用readonly。

最后一个注意事项:常量字段是静态的,但反之则不是真的。

其他回答

有一个与常量的gotcha!如果从另一个程序集引用常量,则其值将直接编译到调用程序集中。这样,当您更新引用程序集中的常量时,它不会在调用程序集中发生更改!

const是编译时常量,而readonly允许在运行时计算值并在构造函数或字段初始值设定项中设置。因此,“const”总是常量,但“readonly”在赋值后是只读的。

C#团队的埃里克·里佩尔(Eric Lippert)有更多关于不同类型不变性的信息。

只读字段的值可以更改。但是,常量字段的值不能更改。

在只读字段中,我们可以在声明时或在该类的构造函数中赋值。如果是常量,我们只能在声明时赋值。

只读可以与静态修饰符一起使用,但常量不能与静态一起使用。

标记为const的变量只不过是强类型的#define宏,在编译时,const变量引用被替换为内联文本值。因此,只能以这种方式使用某些内置基元值类型。标记为只读的变量可以在运行时在构造函数中设置,并且它们的只读性也在运行时强制执行。与此相关的性能开销较小,但这意味着您可以对任何类型(甚至引用类型)使用只读。

此外,常量变量本质上是静态的,而只读变量如果需要可以是特定于实例的。

C#.Net中常量字段和只读字段之间存在显著差异

const在默认情况下是静态的,需要用常量值初始化,以后不能修改。构造函数中也不允许更改值。它不能与所有数据类型一起使用。对于ex-DateTime。它不能与DateTime数据类型一起使用。

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public readonly string Name = string.Empty; //No error, legal

只读可以声明为静态,但不是必需的。无需在声明时进行初始化。它的值可以使用构造函数赋值或更改。因此,它在用作实例类成员时具有优势。两个不同的实例化可能具有不同的只读字段值。对于ex-

class A
{
    public readonly int Id;

    public A(int i)
    {
        Id = i;
    }
}

然后,只读字段可以用即时特定值初始化,如下所示:

A objOne = new A(5);
A objTwo = new A(10);

这里,实例objOne的只读字段值为5,objTwo的值为10。这不可能使用常量。