【问题标题】:'const string' vs. 'static readonly string' in C# [duplicate]C#中的'const string'与'static readonly string' [重复]
【发布时间】:2011-03-12 13:50:45
【问题描述】:

在C#中,有什么区别

static readonly string MyStr;

const string MyStr;

?

【问题讨论】:

    标签: c#


    【解决方案1】:

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

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

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

    注意static string是可以修改的;你应该改用static readonly

    【讨论】:

    • +1,从实用和语义的角度来看,显而易见的结论是:const 应该只用于常量——常量是从不的值, 永远永远改变。
    • @LukeH never,ever,ever 有点强。如果将私有字符串声明为 const 并在两个重新编译事件之间更改它,我想不出会发生什么坏事。
    • @Brenda:我承认我确实使用private const 来表示严格来说不是常量的值;基本上它滥用const 进行微优化。我会坚持我的“永远,永远,永远” 声明,即使它让我成为伪君子。 ;)
    • 特别是字符串的性能如何?每次使用 const 都会在内存中生成一个新的字符串副本吗?
    • @Andrii 不,常量字符串只创建一次。每个用法在内存中都有相同的引用。
    【解决方案2】:

    这里是a good breakdown of the pros and cons

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

    【讨论】:

    • 文章中非常有趣的一点 - “在高层次上,常量显然是在编译时处理的,而静态只读字段是在运行时评估它们时设置的。事实常量值被编译器替换意味着如果常量值发生变化,任何引用常量值的库/程序集都需要重新编译。引用静态只读字段的库将引用该字段而不是值,因此它们将拾取无需重新编译即可对该字段进行任何更改”
    • 这里是谷歌缓存的版本:webcache.googleusercontent.com/…
    • 参考链接不再可用。
    • 这是对标记为解决方案的答案的极好补充。定义用法非常有帮助。来自我的 +1。
    • 是的,对于 const 编译器将用它的实际值替换变量,无论在哪里使用,对于静态,每次访问时都会在运行时查找它。
    【解决方案3】:

    const

    public const string MyStr;
    

    是一个编译时间常量(你可以把它作为一个方法参数的默认参数),如果你使用这种技术,它不会被混淆

    static readonly

    public static readonly string MyStr;
    

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

    【讨论】:

      【解决方案4】:

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

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

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

      如果您的意思是 static readonlyconst,那么我建议在几乎所有情况下使用 static readonly,因为它更具未来性。

      【讨论】:

      • 你说的这个“OQ”是谁?
      • “原始问题”
      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 2012-08-10
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2013-09-05
      • 2011-07-26
      相关资源
      最近更新 更多