C#literal int比较与创建const进行比较

时间:2015-12-16 23:06:59

标签: c# compilation

我正在审核针对各种开发人员编写的代码审核建议,并遇到了一个有趣的建议。

有人最初在LINQ(EF具体)中写了一个基本比较:

myTable.Where(i => i.MyValue == 1);

其中1是存储在数据库中的不变的TypeId。

建议删除硬编码值1以支持const。因此,例如它将被重写为:

const int valueId = 1;
myTable.Where(i => i.MyValue == valueId);

从建议的角度来看,我使用const得到它们的来源,因为代码只需要这个值的单个副本。但也许编译器足够聪明,可以认识到这是一个不变的价值并且对待它的方式也是如此。

所以问题仍然存在,除了消除"魔术数字"这种代码重构实际上是否有任何重要性?

1 个答案:

答案 0 :(得分:2)

在这个级别上,编译器产生的内容极不可能。无论如何,它可能是相同的。关键是,什么是更安全的使用和更容易理解?是' 1'代表任何特别的东西,除了字面值' 1'?基于代码片段,我猜它确实如此,这是引入常量字段的非常好的理由,因为您现在确切地知道在这里检查了什么。

这是字面值' 1'用于任何其他需要更改的地方,如果值更改,例如,对于' 2'?如果是这样,这也是引入常量字段的非常好的理由,因为现在您只需要在一个地方更改值,而不是搜索整个代码库,并且很可能至少缺少一个实例。

另外,从程序员那里获得Ixrec,Vista2是一个常数的可怕名称,因为它没有说明价值是什么。更好的名称是valueId,例如,如果' 1'代表答案的同时' 0'代表问题和' 2'代表评论。