Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么使用常量(或只读)?_C#_Constants - Fatal编程技术网

C# 为什么使用常量(或只读)?

C# 为什么使用常量(或只读)?,c#,constants,C#,Constants,虽然我了解这两个关键字的功能,但我不明白我们为什么要使用它们 我做了很多研究,但我的大部分发现只讨论了什么以及何时使用const或readonly,或者它们之间的区别,但没有一个解释为什么。让我们以下面的例子为例: const decimal pi = 3.142 decimal circumference = 2 * pi * //r 相对于 decimal pi = 3.142 decimal circumference = 2 * pi * //r const/readonly的目的是

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

我做了很多研究,但我的大部分发现只讨论了什么以及何时使用const或readonly,或者它们之间的区别,但没有一个解释为什么。让我们以下面的例子为例:

const decimal pi = 3.142
decimal circumference = 2 * pi * //r
相对于

decimal pi = 3.142
decimal circumference = 2 * pi * //r
const/readonly的目的是防止人们更改值,但用户并没有机会更改十进制pi的值,所以为什么还要麻烦使用const或readonly呢

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


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

这不是为你的程序用户准备的。这是给其他程序员的。它非常清楚地表明,这个值不应该改变。Pi永远不会改变。在您的小示例中,这似乎有点愚蠢,但当项目跨越数千行代码并拆分为函数时,情况可能会有所不同


该值还可以传递到具有不同名称的引用中。程序员如何知道它不应该再被更改?也许他用关键字calculationValue得到了它,他认为我不介意将它改为50.0,以供我使用。他知道的下一件事是,他改变了很多其他方法的pi值。

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

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

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

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

在编写类库时,readonly和const之间的区别有一个有趣的含义。如果使用const,则如果使用不同的const值分发库的新版本,则必须重新编译使用库的所有应用程序。相反,如果您使用只读成员,则应用程序将获取修改后的值,而无需重新编译,正如您所想象的那样,如果您必须分发修补程序或修补程序,这将简化您的生活。

两个原因:

向其他开发人员表明这是一个永远不应该更改的值。它有助于区分pi等值(始终为3.1415…)与某一天可能基于配置、用户输入或某些其他情况的值

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

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

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


我想说的是,这不仅仅是关于用户,还有关于开发者。半年和20000行代码之后,您或任何其他从事代码工作的人可能已经忘记了这一点


Plus,当使用常量时,我可以假设它的性能有所改善,因为这些事情不会改变。考虑一下,如果你正在为其他开发人员或客户使用一个库。在这种情况下,您可能需要确保他们无法更改und


这是一个基于观点的问题。我认为const/readonly有助于提高代码的可读性:+1问题本身似乎很好,只是有点不足-researched@RandomUser被研究的问题不值得一加1。@ McSH @沼泽在C,不像C++,你不能丢掉常态。const在这两种语言中非常不同。非常不同。我没有注意到标签,我的错误。
decimal circumference = 6.284m * r;