SLa*_*aks 154

当您使用一个const字符串,编译器嵌入字符串的值在编译时.
因此,如果const在其他程序集中使用值,然后更新原始程序集并更改该值,则在重新编译之前,其他程序集将不会看到更改.

一个static readonly字符串是都在运行时抬头正常现场.因此,如果在不同的程序集中更改了字段的值,则只要加载程序集就会看到更改,而不进行重新编译.

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

注意a static string可以修改; 你应该用static readonly.

  • 从实际和语义的角度来看,显而易见的结论是:`const`应该只用于常量 - 常量是*永远*,*永远*,*永远*改变的值. (21认同)
  • @Brenda:我承认我确实使用`private const`来表示严格来说不是常量的值; 基本上它是为了微优化目的而滥用`const`.即使它让我成为一个伪君子,我也会支持我的"永远,永远,永远"*的陈述.;) (4认同)
  • @LukeH _never,ever,ever_有点强大.如果将私有字符串声明为const并在两次重新编译事件之间进行更改,我无法想到会发生什么坏事. (3认同)
  • @Andrii 不,常量字符串被创建一次。每次使用都会在内存中具有相同的引用。 (2认同)

spi*_*non 40

以下是优缺点:

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

  • 从文章中非常有趣的一点 - "在高级别,常量显然在编译时处理,而静态只读字段是在运行时评估它们时设置的.事实上,常量值由编译器提供意味着如果常量值发生变化,任何引用常量值的库/汇编都需要重新编译.引用静态只读字段的库将引用字段而不是值,因此它们将在不需要的情况下获取字段中的任何更改重新编译" (16认同)
  • 参考链接不再可用. (2认同)

cdi*_*die 11

快速回答 :

public const string MyStr; 
Run Code Online (Sandbox Code Playgroud)

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

public static readonly string MyStr;
Run Code Online (Sandbox Code Playgroud)

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


Ben*_*Ben 6

OQ被问及static stringVS const.两者都有不同的用例(尽管两者都被视为静态).

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

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

如果你的意思是static readonlyvs const,那么static readonly几乎所有情况都会推荐,因为它更具有未来性.

  • 你说的这个“OQ”是谁? (2认同)