为什么要使用const(或Readonly)

本文关键字:Readonly const 为什么 | 更新日期: 2023-09-27 18:29:13

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

我做了很多研究,但我的大多数发现只谈到了什么时候使用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

补充信息:我需要再澄清一次。我不认为这个问题研究不足。我清楚地理解每个关键词的功能,但我不知道为什么我们要使用它们。它真的能提高性能吗?或者这只是一种"装饰性"的方式来强调:嘿,请不要改变我?

为什么要使用const(或Readonly)

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

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

"Const"的相似之处在于它的值不能更改,但也有很大的不同之处在于它在编译时应用了值。这使得它的内存效率更高,因为在运行时不需要为"const"值分配内存。但是请注意,与"只读"不同,"const"只支持值类型——不允许使用"const"引用类型。

在编写类库时,"readonly"answers"const"之间的区别有一个有趣的含义。如果您使用"const",那么如果您分发了具有不同值的新版本的库,则使用您的库的任何应用程序都必须重新编译。相比之下,如果您使用"只读"成员,那么应用程序将获得修改后的值,而无需重新编译(正如您所想象的,如果您必须分发补丁或修补程序,这将简化您的生活)。

它不适合程序的用户。它是为其他程序员准备的。它非常清楚地表明,这种价值观不应改变。圆周率永远不应该改变。在你的小例子中,这可能看起来有点傻,但当项目跨越数千行代码并被拆分为函数时,情况可能会有所不同。

此外,该值可以传递到具有不同名称的引用中。程序员怎么知道它不应该再更改了?也许他用他认为会的关键字computationValue得到了它。我不介意把它改为50.0。接下来,他知道他改变了π的值,用了很多其他方法。

有几个原因。第一种情况是,如果外部代码可以访问该变量,那么您不希望其他人更改PI的定义,而且它清楚地表明,该变量永远不应该更改,这确实为编译器提供了进行一些优化的能力。还有一个事实是,它可以防止您在自己的代码中犯错误,并意外地更改常数值。

我认为这不仅关乎用户,也关乎开发人员。半年和20000行代码之后,你——或者其他从事代码开发的人——可能已经忘记了这一点。

此外,当使用常数时,可能会提高性能,我认为

两个原因:

  1. 向其他开发人员表明,这是一个永远不应该改变的值。它可以帮助区分像pi(它将始终是3.1415...)这样的值,以及有朝一日可能基于配置、用户输入或某些其他情境条件的值。

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

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

    decimal circumference = 6.284m * r;
    

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