const
常量是编译时确定,并嵌入到客户端代码中的,readonly
只是运行时只读属性。不过const
更快,尽管速度提升可能只是微不足道的。
问题在于,是否存在任何情况下你应该优先选择const
而不是readonly
?或者换句话说,我们不是总是最好使用readonly
而不是const
(记住上述的嵌入性质)吗?
我认为“const”只有在编写程序时,需要用到比程序更持久的规范时才是适用的。例如,如果你正在实现HTTP协议,拥有一个常量成员“GET”是合适的,因为它永远不会改变,客户端可以将其硬编码到已编译的应用程序中,而不必担心后续需要更改该值。
如果有任何可能在将来版本中需要更改该值,请不要使用const。
哦!除非你测量过了,否则不要假定const比readonly字段更快。有JIT优化可能使它实际上完全相同。
以下是在C#中“const”和“readonly”的区别:
- “const”不能是静态的。
- 该值在编译时计算。
- 只能在声明时初始化。
“readonly”:
- 可以是实例级别的或静态的。
- 该值在运行时计算。
- 可以在声明时或构造函数中的代码中初始化。
以上说const不能是静态的,这是个误解。它们不能应用静态关键字,因为它们已经是静态的。
所以当您希望在编译时计算静态项的值时,请使用const。
你可以在 switch 语句中使用常量作为 case,值得一提。
我通常只对永远不会变化的东西使用const,例如真空中的光速。
对于可能会发生更改的事物,我更喜欢使用readonly。这样,如果发生更改,我只需要重新编译一个dll。但是,如果变量是私有的/受保护的/友好的,则可以安全地使用const。
当初始化不是直接的时候,readonly非常有用。
const可以在编译之前确定值时使用。
从某种意义上说,readonly是运行时的const,而const是编译时的常量值。
编辑:如果您查看使用www.koders.com的一些代码,您会发现在可以使用const的地方使用了readonly。我认为,背后的原因可能是它在构造函数中是可修改的(如果需要)。对于const(特别是公共的),您有机会破坏依赖于您代码的客户端代码。
常量(const)不能用于类或结构体(除了字符串常量和 null,正如 Skeet 先生指出的那样),只能用于值类型并作为静态字段访问。常量的值在编译时设置,必须在声明时设置。
只读(readonly)可以用于任何东西,除了枚举,并且可以是静态或实例字段。只读的值在运行时设置,可以根据调用哪个构造函数而有所不同。
这里是一个很好的页面,概述了 const、readonly 和 static 关键字。
当你的字段属于简单类型(数字,布尔或字符串)并且它们的值永远不会更改时,请使用const
。如果更改了它们的值,则应重新编译项目。
当字段从另一个来源(文件,数据库或其他代码等)进行初始化,但之后不会更改时,请使用readonly
字段。
当您想要使它们被所有实例共享时,请使用static readonly
字段。