C#中常量的重点是什么

Ada*_*dam 13 c# constants

谁能说出C#中常量的含义是什么?

例如,做什么有什么好处

const int months = 12;
Run Code Online (Sandbox Code Playgroud)

而不是

int months = 12;
Run Code Online (Sandbox Code Playgroud)

我知道常量不能改变,但为什么不只是...在初始化之后不改变它的值?

Gab*_*abe 31

如果编译器知道某个值是常量并且永远不会更改,则它可以将该值直接编译到您的程序中.

如果你声明pi是一个常量,那么每次它看到pi / 2编译器都可以进行计算并将1.57 ...直接插入到编译的代码中.如果您声明pi为变量,那么每次程序使用pi / 2计算机时都必须引用pi变量并将其乘以0.5,这显然较慢.

我还应该补充说,C#具有readonly编译器无法计算的值,但在程序执行期间不能更改.例如,如果你想要一个常量ProgramStartTime,你必须声明它,readonly DateTime ProgramStartTime = DateTime.Now因为它必须在程序启动时进行评估.

最后,你可以通过给它一个getter而不是setter来创建一个只读属性,如下所示:

int Months { get { return 12; } } 但作为一个属性,每次阅读它时都不必具有相同的值,如下所示:

int DaysInFebruary { get { return IsLeapYear ? 29 : 28 } }

  • 选择const/readonly具有版本控制含义. (2认同)

lad*_*dge 14

当下列情况之一获得时,"不能改变"和"不会改变"之间的区别才真正变得明显:

  • 其他开发人员开始处理您的代码,
  • 第三方开始使用您的代码,或
  • 一年过去了,你回到那个代码.

在谈论数据可访问性时会出现非常类似的问题.我们的想法是,您希望您的代码只提供您想要的灵活性,因为否则某些人(可能是您)会出现并执行您不想要的操作,这会导致错误!

  • 实际上,我认为性能是使用`const`的最差*原因.(这并不是说在一小部分情况下微观优化的可维护性不值得牺牲.) (3认同)

Jas*_*rue 7

如果你永远不犯错误,你工作的任何团队中的任何人都不会犯错误,你永远不会忘记你已经定义的变量的确切目的,即使在回到几个月或几年没有看过的代码之后,你和你你工作的每个人100%可靠地识别,理解并遵循你不打算使用内置语言结构时永远不会改变const值的意图,这种结构既清楚地表明并强制执行const,那么不,没有意义.

如果这些事情中的任何一个事实证明并非如此,那就是重点.

至于我,我发现,即使我最清醒,一次记住超过七件事几乎是不可能的,所以我会尽我所能来防止错误,特别是当成本是一个关键字.如果你比我更聪明,而且你永远不必与一个不如你聪明的人一起工作,那么就做你想做的事.

在某些情况下,可能会有一些编译器优化可以基于constness进行(常量折叠,对于一个,它在编译时折叠由常量组成的表达式).但通常情况下,这不是重点.


Ant*_*ram 3

请记住,您可能不是唯一使用该值的人。您不仅无法更改它,而且使用您的代码(例如作为库)的人也无法更改它。

将其标记为常量也可以使您的意图清晰。