私人const vs public readonly

时间:2011-08-25 04:45:52

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

我有三个类文件,其中常量声明为

private const string PAGE_SIZE = "PageSize";

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

的所有常见常量是否合适
public readonly string PageSize = "PageSize";

这有什么优点和缺点?

4 个答案:

答案 0 :(得分:5)

constreadonly字段之间存在一些重要差异:

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

      

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

         

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

         

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

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

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

答案 1 :(得分:1)

不考虑性能考虑因素 -

  • 赞成:你的常数集中在一个地方。

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

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

答案 2 :(得分:0)

可能是你过早地进行了优化。

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

如果将来PageSize实际上需要在它们之间变化怎么办?它实际上是否需要在所有三个类中同步,或者这只是一个小调整,目前似乎是一个好主意?

答案 3 :(得分:0)

这两者可能具有类似的实际效果,但它们对于表达您的意图非常有用。

因此,const值可以用于类的所有实例,并且永远不会更改。 readonly表示您拥有的数据值对于您的每个类的实例可能不同,但是一旦创建了类,它将是不可变的。当您在不同消费者之间共享类的实例时,不变性可以是非常有用的保证。顺便说一下,在CLR Via C#中,里希特更喜欢只读公共会员到只有公共制定者的房产,我必须把它挖出来并提醒自己为什么。