【问题标题】:Why use const (or Readonly)?为什么使用 const(或 Readonly)?
【发布时间】:2014-11-05 21:07:11
【问题描述】:

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

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

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 是什么。

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

【问题讨论】:

  • 因为这些事情不会改变。
  • 考虑您是否正在构建一个供其他开发人员或客户使用的库。在这种情况下,您可能需要确保它们不能更改基础值。
  • Prolly 这是一个基于意见的问题。我想说 const/readonly 可以帮助您提高代码的可读性:)
  • +1 问题本身似乎很好,只是研究不足
  • @RandomUser 研究不足的问题不值得 +1。

标签: c# constants


【解决方案1】:

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

【讨论】:

  • @marsh 在 C# 中,与 C++ 不同,您不能抛弃 constness。 const 在两种语言中非常不同。 非常不同。
  • 我没有注意到标签,我的错误。
【解决方案2】:

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

"Const" 的相似之处在于它的值不能更改,但完全不同的是它的值是在编译时应用的。这使得它更节省内存,因为在运行时不需要为“const”值分配内存。但请注意,与“readonly”相比,“const”仅支持值类型——不允许使用“const”引用类型。

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

【讨论】:

    【解决方案3】:

    它不适用于您的程序的用户。它适用于其他程序员。它非常清楚地表明不应更改此值。 Pi永远不应该改变。在您的小示例中可能看起来有点傻,但是当项目跨越数千行代码并拆分为函数时,它可能会有所不同。

    该值也可以传递给具有不同名称的引用。程序员怎么知道它不应该再改变了?也许他通过关键字计算值得到它,他认为我不会介意将其更改为 50.0 以供我使用。接下来他知道他为大量其他方法更改了 pi 的值。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        这不仅关乎用户,还关乎开发者。半年和 20,000 行代码之后,您——或任何其他从事代码工作的人——可能已经忘记了这一点。

        另外,我假设使用常量时可能会提高性能

        【讨论】:

          【解决方案6】:

          两个原因:

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

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

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

            decimal circumference = 6.284m * r;
            

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-02-23
            • 2013-09-05
            • 2012-08-02
            • 2012-06-12
            • 1970-01-01
            • 2012-01-07
            • 2021-10-14
            • 1970-01-01
            相关资源
            最近更新 更多