如何警告类型转换导致的潜在算术错误?

我正在使用C#编写计算模块,我碰到了这个:

double v = 4 / 100; 

我知道这是一个错误的初始化,返回v = 0.0而不是v = 0.04

c#规则说我必须确保至少有一个成员是双重的 ,如下所示:

 double v = (double) 4 / 100; double v = 4.0 / 100; 

但是,我有很多涉及整数变量操作的初始化,我觉得懒得逐行浏览我的代码来检测这样的错误。

相反, 是否有可能被编译器警告这个?

好吧,经过一些游戏,什么不是,我有一个解决方案。 我用这篇文章来解决这个问题。我使用StyleCop ,所以你需要得到并安装它。 然后,您可以下载我的C#项目MathematicsAnalyzer 。

首先,我没有考虑所有类型转换不匹配。 事实上,我只容纳一部分。

基本上,我检查该行是否包含“double”后跟一个空格。 我知道这可能会导致错误的警告,因为课程的结尾可能是双重的或任何其他的东西,但我会留给你,以弄清楚如何正确地隔离类型。

如果找到匹配项,我会检查它是否与此正则表达式匹配:

 double[ ][A-Za-z0-9]*[ ]?=(([ ]?[0-9]*d[ ]?/[ ]?[0-9]*;)|[ ]?[0-9]*[ ]?/[ ]?[0-9]*d;) 

如果它 – 不匹配此正则表达式,那么我添加违规。 这个正则表达式将匹配的是以下任何一个:

  • double i = 4d / 100;
  • double i = 4d / 100;
  • double i = 4 / 100d;
  • double i = 4 / 100d;
  • double i = 4 / 100d;
  • double i = 4 / 100d;
  • double i = 4d / 100;
  • double i = 4 / 100d;
  • double i = 4 / 100d;

以上任何一项都不会造成违规。 正如目前所写,几乎如果不使用“d”,它就会违反规定。 您需要添加额外的逻辑来考虑显式转换操作数的其他可能方法。 在我写这篇文章时,我刚刚意识到在两个操作数上都有’d’很可能会抛出exception。 哎呦。

最后,我无法让StyleCop正确显示我的违规行为。 它一直给我一个关于规则不存在的错误,即使用第二双眼睛,我们找不到解决方案,所以我砍了它。 该错误显示了您尝试查找的规则的名称,因此我只将规则的名称作为描述性内容并在其中包含行号。

要安装自定义规则,请构建MathematicalAnalyzer项目。 关闭Visual Studio并将DLL复制到StyleCop安装目录中。 当您打开Visual Studio时,您应该在StyleCop设置中看到规则。 我使用的文章的第5步和第6步显示了在哪里做到这一点。

这在整个解决方案中一次只能获得一次违规,因此您必须修复它显示的违规,然后再次运行StyleCop以查找下一个。 可能有办法解决这个问题,但是我没有果汁而且在这里停了下来。

请享用!

本文介绍如何设置自定义代码分析规则,当您运行代码分析时,可以显示警告和不显示警告。

http://blog.tatham.oddie.com.au/2010/01/06/custom-code-analysis-rules-in-vs2010-and-how-to-make-them-run-in-fxcop-and- VS2008太/