当我们在重构或改bug等时候修改代码时,往往会出现一些未使用的变量和函数,这些未使用的变量和函数一般要么是垃圾,要么是修改引入的bug,往往需要我们及时发现它。例如,对如如下代码:
class Program { static void Main(string[] args) { var obj = new object(); } static void Foo() { } }
其中Main函数的obj变量,Foo函数都是没有地方调用的,应该删掉。但是编译器并不对这些报告警(貌似是为了加快编译速度的原因)。这个问题在其它语言中也存在,在编译器不认为它是告警的情况下,我们往往需要借助一些第三方静态代码分析工具来进行更严格的检查。例如,在C/C++中,pc-lint就是一个比较常用的静态代码分析工具;在.Net语言中通过FxCop进行检查。
自VisualStudio 2010版本开始,微软已经把FxCop集成到VisualStudio中了,并命名为代码分析,可以通过属性页进行设置,也有专门的代码分析窗口设置和执行代码分析功能。
还是回到最开始这个问题上来,虽然微软提供了这个功能,但默认的代码分析规则并不检查找到程序中未使用的变量和函数,为了找到程序中未使用的变量和函数,我打开了所有的规则,然后执行一遍代码分析功能,结果如下:
警告项CA1804,CA1811非常准确的找到了未使用的代码和函数的位置,并且给出了这几个告警的意义和修改建议的,非常有效。不过用过这个工具的朋友就知道,几乎在实际项目中没有敢开所有规则的,那告警多得让你想吐,实际上也用不着那么严格的约束,因此需要我们自己定制带这个检查项的规则。
在上一步通过所有规则分析后知道这两个告警号是CA1804和CA1811,在告警规则编辑器中找到它的位置,然后只要在自定义的告警规则中添加这两条即可。当然,也可以使用内置了这两个检查选项的规则(内置的Microsoft基本设计准则规则和Microsoft扩展设计准则就有,其它规则没细看)。
需要注意的是,只在XAML或代码中通过反射方式访问的变量或函数也会被认为没有访问过,因此这种告警未必是错误,但当某次修改后新增的告警一般就是错误或垃圾了,因此这种告警需要及时发现和修改。
这个检查也可以设置为每次编译的时候就开始检查,不过这个会影响编译速度。另外,我们也不能保证所有的检查告警都能消除,每次生成代码时都看一下有没有新增也比较费劲。我一般的做法是:每次大的改动后和提交代码前都进行一次检查,及时发现规则检查告警,尽量不新增告警。
最后,共享一个注册表文件,主要用来删除所有自定义规则列表的MRU记录的,不想在规则列表里面看到已经被废弃了的自定义规则的可以使用一下。
Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\CodeAnalysis]
"RuleSetMRUList"=-