【问题标题】:private const vs public readonly私有常量与公共只读
【发布时间】:2011-08-25 04:45:51
【问题描述】:

我得到了三个类文件,其中常量声明为

private const string PAGE_SIZE = "PageSize";

将其移动到新文件以保存所有声明为

的公共常量是否很好
public readonly string PageSize = "PageSize";

这样做有什么好处和坏处?

【问题讨论】:

    标签: c# .net c#-3.0 constants readonly


    【解决方案1】:

    constreadonly 字段之间存在一些重要区别:

    1. const 在编译时进行评估。如果您在从应用程序引用的单独程序集中声明const,则对const 的更改只会在使用更新的程序集重新编译应用程序时影响应用程序。引用.NET Design Guidelines for Developing Class Libraries:

      对永远不会改变的常量使用常量字段。

      例如,Math 类将 E 和 PI 定义为静态常量。

      编译器将 const 字段的值直接插入到调用代码中,这意味着永远不能更改 const 值而不会有引入兼容性问题的风险。

    2. readonly 字段可以在运行时初始化,使您能够执行运行时计算以计算值和使用。 const 只能由可以在编译时完全计算的常量表达式声明。唯一可以为const 的引用类型是String

    关于您的具体问题,这实际上取决于如何使用这些常量。显然你不应该对同一个常量有多个定义。否则可能更容易理解常量是否在使用它的地方声明为“附近”,例如在类中,甚至在使用它的方法中。

    【讨论】:

    • 我无法理解第一点——当然,如果您在任何一种情况下更改实际值,则程序集需要重新编译,并且用户需要使用重新编译的程序集?
    • @Tim Barrass:如果您的应用程序在运行时使用重新编译的程序集(通过加载它),您的应用程序将不会看到该程序集中的常量有任何更改。您的应用程序将使用编译时定义的常量。如果链接的程序集被修改和部署以修补您的应用程序,您将面临应用程序与常量“不同步”的风险。您的应用程序可以是 Web 应用程序,而链接的程序集是在实时服务器上更新的框架,而无需重新编译您的应用程序。
    • Ta;这不应该,但对我来说是违反直觉的,所以今天晚些时候会玩,谢谢编辑帮助(编译器直接插入值)。如果有人认为更高或更低的精度更合适,我会认为数学库中的 E 和 PI 可能会改变;)但那是迂腐的,文档的重点是..
    【解决方案2】:

    抛开性能考虑 -

    • 赞成:您的常量都集中在一个地方。

    • 反对:您的常量不再接近它们的使用点。

    对于在类之间共享的常量,将它们分解为一个通用的单个类是有意义的,这样它们只被指定一次。然而,这意味着“不适当的耦合”,所以可能所有使用这个常量的逻辑都需要在同一个类中。

    【讨论】:

    • +1 表示不适当的耦合——可能表明需要提取一个类,现有的三个类然后由组合使用。
    【解决方案3】:

    两者可能具有相似的实际效果,但它们对于表明您的意图很有用。

    因此,const 值对类的所有实例都可用,并且永远不会改变。 readonly 表示您有一个数据值,该数据值对于您的类的每个实例可能不同,但在创建类后将是不可变的。当您在不同的消费者之间共享类的实例时,不变性可能是一个非常有用的保证。顺便说一句,在 CLR Via C# 中,Richter 更喜欢只读的公共成员而不是只有公共设置器的属性,我必须挖掘它并提醒自己为什么。

    【讨论】:

    • +1,因为我认为这实际上是一个有用的部分解释,并且看不出为什么它被否决了。尽管您可能想找出不可变的常量收集类与具有不可变常量的各个原始类之间的区别。关键是数据是否接近使用点。
    【解决方案4】:

    可能是你优化得太早了。

    这可能意味着通过使常量共享和公开而失去灵活性——在不知道现有类是什么的情况下很难说。

    如果 PageSize 将来真的需要在它们之间变化怎么办?它实际上是否需要在所有三个类之间同步,或者这只是目前看起来不错的一个小调整?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-25
      • 2011-07-22
      • 2020-06-06
      • 2022-09-24
      • 2012-12-28
      • 1970-01-01
      • 2011-06-18
      • 2011-01-05
      相关资源
      最近更新 更多