C#文本int比较与创建用于比较的常量
本文关键字:比较 用于 常量 创建 文本 int | 更新日期: 2023-09-27 18:27:03
我正在审查由各个开发人员编写的代码审查建议,并发现了一个有趣的建议。
有人最初在LINQ中写了一个基本的比较(具体来说是EF):
myTable.Where(i => i.MyValue == 1);
其中1
是存储在数据库中的不变的TypeId。
建议删除硬编码的值1,使用const。例如,它将被重写为:
const int valueId = 1;
myTable.Where(i => i.MyValue == valueId);
从建议的角度来看,我了解了const
的来源,因为代码只需要这个值的一个副本。但也许编译器足够聪明,能够认识到这是一个不变的值,并以类似的方式对待它。
因此,问题仍然存在,这种代码重构除了消除"幻数"之外,真的有什么分量吗?
在这个级别上,编译器生成的内容不太可能很重要。无论如何,情况可能都是一样的。重点是,什么使用起来更安全、更容易理解?"1"是否表示除文字值"1"之外的任何特定内容?根据代码片段,我猜它确实如此,这是引入常量字段的很好的理由,因为您现在确切地知道这里要检查的是什么。
如果值更改为"2",则此文字值"1"是否用于其他需要更改的位置?如果是这样的话,这也是引入常量字段的很好的理由,因为现在你只需要在一个地方更改值,而不需要搜索整个代码库,而且很可能至少缺少一个实例。
此外,归功于程序员的Ixrec,valueId
是一个糟糕的常数名称,因为它没有说明值是什么。如果"1"表示答案,"0"表示问题,"2"表示评论,则answersId
是一个更好的名称。
首先,两个版本的代码将编译为完全相同的IL。
常数不是变量。在编译时,常量的任何用法都会被其值所取代。
使用const
而不是文字有两个优点
- 常数可以定义一次,并在许多地方使用。所以,如果你需要改变常数的值,你只需要在一个地方改变它*
- 您可以为常量指定一个有意义的名称
(*)永远不要更改public const
字段的值-使用此常量的所有其他程序集都必须重新编译才能使用更新后的值。