为什么要使用const(或Readonly)?

时间:2014-11-05 21:07:12

标签: c# const

虽然我理解这2个关键字的功能,但我不明白为什么要使用它们。

我做了很多研究,但我的大部分研究结果只讨论了使用constreadonly的时间和时间,或者每种情况之间的差异,但没有一个解释为什么。我们来看下面的例子:

const decimal pi = 3.142
decimal circumference = 2 * pi * //r

而不是

decimal pi = 3.142
decimal circumference = 2 * pi * //r

const/readonly的目的是阻止人们更改价值,但不是用户有机会更改decimal pi的值,那么为什么还要使用const (或readonly)?

请注意:我的问题是为什么我们使用const/readonly,而不是“const/readonly

其他信息:我需要再次澄清这一点。我认为这个问题没有得到充分研究。我清楚地了解每个关键字的功能,但我不知道为什么我们甚至打扰使用它们。它真的能提高性能吗?或者它只是一种强调的“装饰性”方式:嘿 - 请不要改变我?

6 个答案:

答案 0 :(得分:3)

编译器优化并告诉其他人开发人员他们不应该被修改。

答案 1 :(得分:1)

它不适合您的程序用户。它适用于其他程序员。它非常清楚地表明这个值不应该改变。 Pi永远不应该改变。在你的小例子中看起来有些愚蠢,但是当项目跨越数千行代码并分成函数时,它可能会有所不同。

此值也可以传递给具有不同名称的引用。程序员如何知道它不应该再被更改?也许他用关键字calculateValue得到它,他认为我不介意将其改为50.0用于我的用途。接下来他知道他改变了其他方法的价值。

答案 2 :(得分:1)

有几个原因。第一个是如果变量可以被外部代码访问,你不希望别人改变PI的定义,也就是说它明确表示这个变量永远不会改变,这确实为编译器提供了能力。做一些优化。然后还有这样一个事实:它可以防止你在你自己的代码中犯错并意外地改变一个常数值。

答案 3 :(得分:1)

“Readonly”表达了您作为程序员的意图和保障。如果可以强制执行只读约束,它会让您的生活更轻松(以及将来必须维护代码的任何人)。例如,如果您有一个在构造函数中初始化的“只读”成员,则永远不必检查它是否为空引用。

“Const”的相似之处在于它的值不能改变,但也有很大的不同之处在于它的值在编译时应用。这使得它更具内存效率,因为在运行时不需要为“const”值分配内存。但请注意,与“readonly”相反,“const”仅支持值类型 - 不允许使用“const”引用类型。

在编写类库时,“readonly”和“const”之间存在一个有趣的含义。如果使用“const”,那么如果使用“const”的不同值分发新版本的库,则必须重新编译使用库的任何应用程序。相比之下,如果您使用“只读”成员,那么应用程序将获取修改后的值而无需重新编译(如您所知,如果您必须分发补丁或修补程序,这将简化您的生活)。 / p>

答案 4 :(得分:0)

有两个原因:

  1. 向其他开发者表​​明这是一个永远不会改变的价值。它可以帮助区分pi(总是3.1415...)之类的值,有时可能基于配置或用户输入的值,或其他一些情境条件。

    沿着同样的路线,你可以帮助阻止其他开发人员做一些愚蠢的事情,比如试图为pi变量分配一个新值,因为编译器会对它们大喊大叫。在这样一个简单的两行方法中,这不太可能成为一个问题,但随着您的代码库变得越来越复杂,它可以为人们节省大量时间来防止他们做的事情他们不会应该做的。

  2. 允许编译器进行优化。初始编译和JIT编译都可以利用有关您知道不会更改的值的信息。在您给出的示例中,当您使用const关键字时,编译器将生成以下代码的等效代码:

    decimal circumference = 6.284m * r;
    

    注意每次调用方法时CPU不需要多个2 * pi,因为这是一个在编译时已知的值。

答案 5 :(得分:0)

不仅是关于用户,还关于开发人员我会说的。半年和20,000行代码之后 - 或者其他任何从事代码工作的人 - 可能只是忘记了这一点。

另外,使用常数时可能会改善性能