我有三个类文件,其中常量声明为
private const string PAGE_SIZE = "PageSize";
将其移动到新文件以保存声明为
的所有常见常量是否合适public readonly string PageSize = "PageSize";
这有什么优点和缺点?
答案 0 :(得分:5)
const
和readonly
字段之间存在一些重要差异:
在编译时评估const
。如果在从应用程序引用的单独程序集中声明const
,则const
的更改只会影响应用程序(如果使用更新的程序集重新编译)。引用.NET Design Guidelines for Developing Class Libraries:
对永远不会改变的常量使用常量字段。
例如,Math类将E和PI定义为静态常量。
编译器将const字段的值直接插入到调用代码中,这意味着永远不会更改const值,而不存在引入兼容性问题的风险。
可以在运行时初始化readonly
字段,使您可以执行运行时计算以计算值和使用。 const
只能通过可在编译时完全计算的常量表达式声明。唯一可以是const
的引用类型是String
。
关于您的具体问题,它实际上取决于如何使用这些常量。显然,您不应该对同一常量有多个定义。否则,如果常量被声明为“接近”使用它,则可能更容易理解,例如,在课堂上甚至是使用它的方法。
答案 1 :(得分:1)
不考虑性能考虑因素 -
赞成:你的常数集中在一个地方。
反对:你的常数不再接近它们的使用点。
对于在类之间共享的常量,将它们分解为公共单个类是有意义的,因此它们只被指定一次。然而,这意味着“不适当的耦合”,因此可能所有使用此常量的逻辑都需要在同一个类中。
答案 2 :(得分:0)
可能是你过早地进行了优化。
这可能意味着通过使常量共享和公共而失去灵活性 - 很难说不知道现有类是什么。
如果将来PageSize实际上需要在它们之间变化怎么办?它实际上是否需要在所有三个类中同步,或者这只是一个小调整,目前似乎是一个好主意?
答案 3 :(得分:0)
这两者可能具有类似的实际效果,但它们对于表达您的意图非常有用。
因此,const值可以用于类的所有实例,并且永远不会更改。 readonly表示您拥有的数据值对于您的每个类的实例可能不同,但是一旦创建了类,它将是不可变的。当您在不同消费者之间共享类的实例时,不变性可以是非常有用的保证。顺便说一下,在CLR Via C#中,里希特更喜欢只读公共会员到只有公共制定者的房产,我必须把它挖出来并提醒自己为什么。