const字符串与c#中的静态只读字符串

在C#中,它们之间的区别是什么

static readonly string MyStr;

const string MyStr;
Mark Attwood asked 2019-08-13T19:06:49Z
5个解决方案
141 votes

当您使用static string字符串时,编译器会在编译时嵌入字符串的值。
因此,如果在另一个程序集中使用static readonly值,然后更新原始程序集并更改该值,则另一个程序集将不会看到更改,直到您重新编译它为止。

static string字符串是在运行时查找的普通字段。 因此,如果在不同的程序集中更改了字段的值,则只要加载程序集就会看到更改,而无需重新编译。

这也意味着static string字符串可以使用非常量成员,例如static readonlyDateTime.Now.ToString()。只能使用其他常量或文字初始化字符串const
另外,可以在静态构造函数中设置static readonly字符串; 一个const字符串只能内联初始化。

注意,可以修改static string; 你应该用static readonly代替。

SLaks answered 2019-08-13T19:07:40Z
35 votes

以下是优缺点:

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

spinon answered 2019-08-13T19:08:14Z
10 votes

快速回答 :

public const string MyStr; 

是编译时常量(例如,您可以将它用作方法参数的默认参数),如果您使用此类技术,它将不会被混淆

public static readonly string MyStr;

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

cdie answered 2019-08-13T19:08:53Z
5 votes

OQ询问了static readonly vs const.两者都有不同的用例(尽管两者都被视为静态)。

仅将const用于真正恒定的值(例如光速 - 但即使这取决于介质也是如此)。 这个严格准则的原因是const值被替换为引用它的程序集中const的使用,这意味着如果const在其定义位置发生变化,你可以有版本问题(即它不应该是 毕竟是一个常数)。 请注意,这甚至会影响static readonly字段,因为您可能在不同的程序集中具有基类和子类,并且继承了私有字段。

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

如果您的意思是static readonly vs const,那么几乎所有情况我都推荐static readonly,因为它更具有前瞻性。

Ben answered 2019-08-13T19:09:41Z
0 votes

您只能在类的static构造函数或变量初始值设定项中更改static readonly string的值,而不能在任何位置更改const字符串的值。

Hamza KhãñzãDã answered 2019-08-13T19:10:07Z
translate from https://stackoverflow.com:/questions/3190870/const-string-vs-static-readonly-string-in-c-sharp