找出C#代码中未使用的变量和函数

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"=-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、我们在Main()函数中,调用Test()函数,我们管Main()函数称之为调用者, 管Test()函数称之为被调用者。 如果被调用者想要得到调用者的值: 1)、传递参数。 2)、使用静态字段来模拟全局变量。 如果调用者想要得到被调用者的值: 1)、返回值 2、 不管是实参还是形参,都是在内存中开辟了空间的。 3、方法的功能一定要单一。 GetMax(int n1,int n2) 方法中最忌讳的就是出现提示用户输入的字眼。 4、out、ref、params 1)、out参数。 如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组。 但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候, 我们可以考虑使用out参数。 out参数就侧重于在一个方法中可以返回多个不同类型的值。 2)、ref参数 能够将一个变量带入一个方法中进行改变,改变完成后,再讲改变后的值带出方法。 ref参数要求在方法外必须为其赋值,而方法内可以不赋值。 3)、params可变参数 将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理。 params可变参数必须是形参列表中的最后一个元素。 5、方法的重载 概念:方法的重载指的就是方法的名称相同给,但是参数不同。 参数不同,分为两种情况 1)、如果参数的个数相同,那么参数的类型就不能相同。 2)、如果参数的类型相同,那么参数的个数就不能相同。 ***方法的重载跟返回值没有关系。 6、方法的递归 方法自己调用自己。 找出一个文件夹中所有的文件。 1、画游戏头 2、初始化地图(加载地图所需要的资源) 将整数数组中的数字编程控制台中显示的特殊字符串的这个过程 就是初始化地图 3、画地图 4、玩游戏 游戏规则: 如果玩家A踩到了玩家B 玩家B退6格 踩到了地雷 退6格 踩到了时空隧道 进10格 踩到了幸运轮盘 1交换位置 2 轰炸对方 使对方退6格 踩到了暂停 暂停一回合 踩到了方块 神马都不干 Map[50] if(map[40]==1) { Console.WriteLine("◎"); } //初始化地图 Map[6]=1 //我用0表示普通,显示给用户就是 □ //....1...幸运轮盘,显示组用户就◎ //....2...地雷,显示给用户就是 ☆ //....3...暂停,显示给用户就是 ▲ //....4...时空隧道,显示组用户就 卐 int[] luckyturn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘◎ int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷☆ int[] pause = { 9, 27, 60, 93 };//暂停▲ int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道卐 for(int i=0;i<luckyturn.Length;i++) { int n=luckyturn[i]; Map[n]=1; } for(int i=0;i<landMine.Length;i++) { int n=landMine[i]; Map[n]=1; } public static void Win() { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(" ◆ "); Console.WriteLine(" ■ ◆ ■ ■"); Console.WriteLine(" ■■■■ ■ ■ ◆■ ■ ■ ■"); Console.WriteLine(" ■ ■ ■ ■ ◆ ■ ■ ■ ■"); Console.WriteLine(" ■ ■ ■■■■■■ ■■■■■■■ ■ ■ ■"); Console.WriteLine(" ■■■■ ■ ■ ●■● ■ ■ ■"); Console.WriteLine(" ■ ■ ■ ● ■ ● ■ ■ ■"); Console.WriteLine(" ■ ■ ■■■■■■ ● ■ ● ■ ■ ■"); Console.WriteLine(" ■■■■ ■ ● ■ ■ ■ ■ ■"); Console.WriteLine(" ■ ■ ■ ■ ■ ■ ■ ■"); Console.WriteLine(" ■ ■ ■ ■ ■ ■ "); Console.WriteLine(" ■ ■ ■ ■ ● ■ "); Console.WriteLine(" ■ ■■ ■■■■■■ ■ ● ●"); Console.ResetColor(); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值