常量string与静态只读string在C#

在C#中,有什么区别

static readonly string MyStr; 

 const string MyStr; 

当你使用一个conststring时,编译器会在编译时embeddedstring的值。
因此,如果在不同的程序集中使用const值,则更新原始程序集并更改该值,否则在重新编译之前,其他程序集将看不到更改。

static readonlystring是在运行时查找的普通字段。 因此,如果该字段的值在不同的程序集中发生更改,程序集加载后即可看到更改,无需重新编译。

这也意味着static readonlystring可以使用非常量成员,如Environment.UserNameDateTime.Now.ToString()conststring只能使用其他常量或文字进行初始化。
而且, static readonlystring可以在静态构造函数中设置; 一个conststring只能被内联初始化。

请注意,可以修改static string ; 你应该使用static readonly

这是一个很好的细分利弊 :

所以,当值不可能发生改变时,或者如果没有外部应用程序/库将使用常量,应该使用常量。 当需要运行时计算,或者如果外部消费者是一个因素,应该使用静态只读字段。

OQ询问static stringconst 。 两者都有不同的用例(尽pipe两者都被视为静态)。

使用常量只有真正的恒定值(例如光速 – 但即使这取决于媒体)。 这个严格的准则的原因是,const值被replace成引用它的程序集中的const的用法,这意味着如果const在定义的位置发生变化(即它不应该是一个常量毕竟)。 请注意,这甚至会影响private const字段,因为您可能在不同的程序集中有基类和子类,并且私有字段会被inheritance 。

静态字段与它们在其中声明的types绑定。 它们用于表示给定types的所有实例需要相同的值。 这些字段可以根据需要多次写入(除非指定只读)。

如果你的意思是static readonlyconst ,那么我build议static readonly几乎所有的情况下,因为它是更有前途的证据。

快速回答 :

 public const string MyStr; 

编译时间常量(例如,您可以将其用作方法参数的默认参数),如果您使用这种技术,则不会被模糊处理

 public static readonly string MyStr; 

运行时常量,这意味着它在应用程序启动时而不是之前被评估。 这就是为什么它不能用作方法(编译错误)的默认参数。 存储在其中的值可能会被混淆

您只能在类的static构造函数或variables初始值设定项中更改static readonly string的值,而不能在任何地方更改conststring的值。