何时,如果需要的话,我们应该使用const?

32

const常量是编译时确定,并嵌入到客户端代码中的,readonly只是运行时只读属性。不过const更快,尽管速度提升可能只是微不足道的。

问题在于,是否存在任何情况下你应该优先选择const而不是readonly?或者换句话说,我们不是总是最好使用readonly而不是const(记住上述的嵌入性质)吗?

11个回答

39

我认为“const”只有在编写程序时,需要用到比程序更持久的规范时才是适用的。例如,如果你正在实现HTTP协议,拥有一个常量成员“GET”是合适的,因为它永远不会改变,客户端可以将其硬编码到已编译的应用程序中,而不必担心后续需要更改该值。

如果有任何可能在将来版本中需要更改该值,请不要使用const。

哦!除非你测量过了,否则不要假定const比readonly字段更快。有JIT优化可能使它实际上完全相同。


2
如果有任何可能在未来版本中需要更改值的机会,请不要使用const。我不明白你的逻辑。常量的一部分意义在于您可以在将来的版本中更改它。 - Powerlord
19
如果一个常量比“internal”更公开(或者它只是internal但你使用了InternalsVisibleTo),那么IL编译器可以将常量值复制到引用程序集中。这意味着如果您发布新版本并更改常量,则现在与消费者不同步。 - Andrew Arnott
1
@AndrewArnott 感谢您最后的澄清,我敢说那是一个非常重要的点! - AgentKnopf
我已经搬到了一个编码标准似乎更喜欢使用常量的地方。如果你不是在编写要被消耗的库,那么这样做是否正确呢?也就是说,你正在编写的应用程序具有常量,但最终部署的是应用程序。 - Craig Brett
当然。如果你正在构建的东西只是部署,而且永远不会链接到比你正在构建的更长寿的东西中,那么你就没问题了。 - Andrew Arnott

16

Const vs readonly

以下是在C#中“const”和“readonly”的区别:

  • “const”不能是静态的。
  • 该值在编译时计算。
  • 只能在声明时初始化。

“readonly”:

  • 可以是实例级别的或静态的。
  • 该值在运行时计算。
  • 可以在声明时或构造函数中的代码中初始化。

以上说const不能是静态的,这是个误解。它们不能应用静态关键字,因为它们已经是静态的。

所以当您希望在编译时计算静态项的值时,请使用const。


5

你可以在 switch 语句中使用常量作为 case,值得一提。


4

我通常只对永远不会变化的东西使用const,例如真空中的光速。

对于可能会发生更改的事物,我更喜欢使用readonly。这样,如果发生更改,我只需要重新编译一个dll。但是,如果变量是私有的/受保护的/友好的,则可以安全地使用const。


3

当初始化不是直接的时候,readonly非常有用。
const可以在编译之前确定值时使用。

从某种意义上说,readonly是运行时的const,而const是编译时的常量值。

编辑:如果您查看使用www.koders.com的一些代码,您会发现在可以使用const的地方使用了readonly。我认为,背后的原因可能是它在构造函数中是可修改的(如果需要)。对于const(特别是公共的),您有机会破坏依赖于您代码的客户端代码。


2

常量(const)不能用于类或结构体(除了字符串常量和 null,正如 Skeet 先生指出的那样),只能用于值类型并作为静态字段访问。常量的值在编译时设置,必须在声明时设置。

只读(readonly)可以用于任何东西,除了枚举,并且可以是静态或实例字段。只读的值在运行时设置,可以根据调用哪个构造函数而有所不同。

这里是一个很好的页面,概述了 const、readonly 和 static 关键字。


完全不正确。我认为你混淆了语言 - 这是C ++。 - Arafangion
1
const 可以与引用类型一起使用 - 只有字符串常量和 null 才是引用类型常量。 - Jon Skeet

1
你应该优先选择在编译时测试的修饰符,而不是在运行时测试的修饰符(在这种情况下,const 优于 readonly)。并且你应该始终使用支持你所需语义的修饰符。如果某些东西不打算被修改 - 保护它,否则有人会无意或无知地对其进行更改。

0

当你的字段属于简单类型(数字,布尔或字符串)并且它们的值永远不会更改时,请使用const。如果更改了它们的值,则应重新编译项目。

当字段从另一个来源(文件,数据库或其他代码等)进行初始化,但之后不会更改时,请使用readonly字段。

当您想要使它们被所有实例共享时,请使用static readonly字段。


0

每当您可以在声明中设置值并且不必等待构造函数时,应使用const。


这里肯定还有其他需要考虑的注意事项。此处也可参见 - Marc L.

0
一个好的 const 的用法是用于键/值对的键。例如,如果您仍在使用 AppSetting(而不是 ApplicationSettings),将键的名称加载到配置设置中并没有太多意义。如果它在多个地方使用,请将 Key 放入 const 中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接