【发布时间】:2011-08-25 04:45:51
【问题描述】:
我得到了三个类文件,其中常量声明为
private const string PAGE_SIZE = "PageSize";
将其移动到新文件以保存所有声明为
的公共常量是否很好public readonly string PageSize = "PageSize";
这样做有什么好处和坏处?
【问题讨论】:
标签: c# .net c#-3.0 constants readonly
我得到了三个类文件,其中常量声明为
private const string PAGE_SIZE = "PageSize";
将其移动到新文件以保存所有声明为
的公共常量是否很好public readonly string PageSize = "PageSize";
这样做有什么好处和坏处?
【问题讨论】:
标签: c# .net c#-3.0 constants readonly
const 和 readonly 字段之间存在一些重要区别:
const 在编译时进行评估。如果您在从应用程序引用的单独程序集中声明const,则对const 的更改只会在使用更新的程序集重新编译应用程序时影响应用程序。引用.NET Design Guidelines for Developing Class Libraries:
对永远不会改变的常量使用常量字段。
例如,Math 类将 E 和 PI 定义为静态常量。
编译器将 const 字段的值直接插入到调用代码中,这意味着永远不能更改 const 值而不会有引入兼容性问题的风险。
readonly 字段可以在运行时初始化,使您能够执行运行时计算以计算值和使用。 const 只能由可以在编译时完全计算的常量表达式声明。唯一可以为const 的引用类型是String。
关于您的具体问题,这实际上取决于如何使用这些常量。显然你不应该对同一个常量有多个定义。否则可能更容易理解常量是否在使用它的地方声明为“附近”,例如在类中,甚至在使用它的方法中。
【讨论】:
抛开性能考虑 -
赞成:您的常量都集中在一个地方。
反对:您的常量不再接近它们的使用点。
对于在类之间共享的常量,将它们分解为一个通用的单个类是有意义的,这样它们只被指定一次。然而,这意味着“不适当的耦合”,所以可能所有使用这个常量的逻辑都需要在同一个类中。
【讨论】:
两者可能具有相似的实际效果,但它们对于表明您的意图很有用。
因此,const 值对类的所有实例都可用,并且永远不会改变。 readonly 表示您有一个数据值,该数据值对于您的类的每个实例可能不同,但在创建类后将是不可变的。当您在不同的消费者之间共享类的实例时,不变性可能是一个非常有用的保证。顺便说一句,在 CLR Via C# 中,Richter 更喜欢只读的公共成员而不是只有公共设置器的属性,我必须挖掘它并提醒自己为什么。
【讨论】:
可能是你优化得太早了。
这可能意味着通过使常量共享和公开而失去灵活性——在不知道现有类是什么的情况下很难说。
如果 PageSize 将来真的需要在它们之间变化怎么办?它实际上是否需要在所有三个类之间同步,或者这只是目前看起来不错的一个小调整?
【讨论】: