找出C#代码中未使用的变量和函数
来源:互联网 发布:顿巴纵队 知乎 编辑:程序博客网 时间:2024/05/06 01:08
http://www.cnblogs.com/TianFang/archive/2012/11/26/2789478.html
当我们在重构或改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"=-
- 找出C#代码中未使用的变量和函数
- 如何监控并找出系统中存在的大量的未使用绑定变量的SQL
- 如何找出应用程序未使用绑定变量
- 如何找出应用程序未使用绑定变量,关于绑定变量的再次认识
- c#出错:使用了未赋值的局部变量weekStr
- c#中变量的使用
- 找出未被使用的索引
- C#语言中变量的使用和注意事项
- C# 类中属性和成员变量的使用
- C# 类中属性和成员变量的使用
- C# 类中属性和成员变量的使用
- C语言中未使用变量的问题
- 未使用的局部变量
- c#的静态变量和静态函数
- 使用代码找出应用的包名和startActivity
- MFC中文档类和视图类中MessageBox的不同,Invalidate()在文档类使用是未申明变量
- 【心得】在C#中使用静态变量const和动态变量readonly的区别
- js中函数、变量如何在C#中使用?C#中函数、变量如何在js中使用?
- #ifdef __cplusplus extern "C" { #endif
- Android Fragment 真正的完全解析(上)
- YT02-简单数学课后题-1002 Delta-wave -(5.31日-烟台大学ACM预备队解题报告)
- VC6.0 OpenGL环境配置及编程基础
- UBD->MVC->Struts的演变
- 找出C#代码中未使用的变量和函数
- php连接mssql
- centos24448
- MYSQL校对规则
- V4l2 capture时 USERPTR和MMAP的区别
- Oracle学习(9):创建和管理表
- C#泛型约束
- php连接oracle
- LeetCode Container With Most Water