SuppressMessage和代码分析

来源:互联网 发布:更换ssh端口 编辑:程序博客网 时间:2024/05/27 20:13

读C#源代码的时候,经常看到如下代码:

[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")][SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]public Method(int arg){    //code}

这个SuppressMessage到底有什么作用?翻阅MSDN,其实它的直接作用很简单,就是忽略掉代码检查时违反检查规则发出的警告。

代码检查

好的代码检查工具可以减少程序员出错概率,提高代码的质量。Visual Studio自带强大的代码检查工具,下面简单举例说明代码检查如何工作:
1. 打开VS(我使用的是VS2012 Ultimate版),新建一个C#类库项目CodeCheckSample。
2.在默认类Class1写Add方法。

namespace CodeCheckSample{    public class Class1    {        public int Add(int a, int b)        {            return a + b;        }    }}

生成项目,成功!!!
3.打开“分析-》为CodeCheckSample运行代码分析”,在“代码分析”窗口,运行结果显示“未检测到任何代码分析问题”。这是否意味我们的代码完美?至少我不这么认为。
4.再打开“分析-》为CodeCheckSample配置代码分析”,可以看到当前的规则集是“Microsoft托管建议规则”,将其改为“Microsoft所有规则”。
这里写图片描述
这里写图片描述
4.重复3,再次进行代码分析,在代码分析窗口可以看到5个警告。
这里写图片描述
5.这说明代码分析工具是根据指定的规则集来进行代码检查。根据警告内容提示,我们对代码进行整改。

namespace CodeCheckSample{    public static class Class1    {        public static int Add(int valueA, int valueB)        {            return valueA + valueB;        }    }}

6.再次运行分析,警告还剩下2个,都是关于程序集的。
这里写图片描述
考虑这两个警告,一个意思是说这个类库的公开方法可能被其他语言(如VB)程序集调用,因此要符合CLS规范,需要用CLSCompliantAttribute来进行标记,另一个是说程序集要用强名称签名。
如果我们确定这个程序集只会被C#调用,而且不需要强名称签名,可以通过“操作”将这两个警告忽略掉。
这里写图片描述
这时我们会看到项目中多了一个GlobalSuppressions.cs文件,打开其内容为:

// 代码分析使用此文件来维护应用到此项目的 SuppressMessage // 特性。// 项目级禁止显示或者没有目标,或者已给定 // 一个特定目标且其范围为命名空间、类型和成员等。//// 若要向此文件中添加禁止显示,请右击 // 代码分析结果中的消息,指向“禁止显示消息”,然后单击 //“在禁止显示文件中”。// 无需手动向此文件添加禁止显示。[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1014:MarkAssembliesWithClsCompliant")][assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA2210:AssembliesShouldHaveValidStrongNames")]

7.再次运行代码分析,警告不见了。

总结

  1. 代码分析通过设置规则集来对代码的质量和偏好进行不同级别的检查,程序员可以根据当前项目属性和需要选择不同规则集,也可以定制自己的规则集。
  2. 代码分析的目的帮助提高代码质量,发现潜在的代码缺陷,是团队成员协助开发保证代码质量的重要手段之一。可以通过Check-in policy来强制检查每一个人签入的代码。
  3. 并不是每一个警告都需要花费时间和精力去解决,程序员需要自己判断是否值得。对于确定不需要理会的部分警告规则,可以用SuppressMessage加以忽略,这就是SuppressMessage的作用。
0 0