“源代码中禁止显示”概述

检查代码之后,您可能确定代码是正确的。也可能是以下情况,即某些冲突的优先级较低,因此不会在当前的开发周期中修复。无论出于何种原因,以下操作通常是有用的,即指出相应警告不适用,以使小组成员了解代码已经过检查并已决定取消警告。“源代码中禁止显示”(ISS) 很有用,因为开发人员可以将取消警告的修饰放在靠近警告本身的位置。

  • SuppressMessage 属性

    使用有条件发出的托管代码自定义属性 SuppressMessage 来呈现“源代码中禁止显示”。该属性具有下列组成部分:

     

    [Scope:SuppressMessage("Rule Category", "Rule Id", "Justification", "MessageId", "Scope", "Target")]

     

    • Rule Category:定义的规则所属的类别。

    • Rule Id:规则的标识符。支持对规则 ID 的使用短名称或长名称。短名称为 CAXXXX;长名称为 CAXXXX:FriendlyTypeName。

    • Target:用于指定在其上禁止显示警告的目标的标识符。

    • Justification:用于记录禁止显示消息的原因的文本。

    • Scope:在其上禁止显示警告的目标。如果未指定目标,则设置为属性的目标。支持的范围包括:

    • 模块

    • 命名空间

    • 资源

    • 类型

    • 成员

    • 参数

    • Message Id:方法的名称。

  • 用法

    常见的情况是在 SuppressMessage 属性的实例所应用于的级别禁止显示冲突。禁止显示的一般形式包括规则类别和一个规则标识符,该标识符包含可选的规则名称的用户可读表示形式。它优先于记录规则名称的源代码注释,以确保信息与排除紧密相连。例如,

    [SuppressMessage("Microsoft.Design", "CA1021:Avoid out parameters")]

     

    如果出于严格的性能原因,要求最大程度地减少 ISS 元数据,则可以省略规则名称本身。规则类别及其“rule id”(规则 ID)一起构成足够唯一的规则标识符。例如,

    [SuppressMessage("Microsoft.Design", "CA1021")]

    出于可维护性的原因,建议不要使用该格式。

     

  • 在方法体内禁止显示多个冲突

    属性只能应用于方法,而不能嵌入到方法体中。但是,您可以将方法名称指定为消息 ID,以便在方法体内多次出现冲突时进行区分。

    在下面的示例中,方法 Test 引发对 Fair () 和 Bad () 的所有调用的托管代码分析冲突。SuppressMessage 属性禁止显示对 Fair 的所有调用的冲突;对 Bad 的调用仍会引发冲突。

     

    [SuppressMessage("Microsoft.Design ", "CA1039:Lists are strongly typed", MessageId= "F1")]

    void Test()

    {

    Fair(); // calling Fair() causes violations

    Bad(); // calling Bad()also raises violations

    Fair(); // calling Fair() causes violations

    }

     

  • 模块级禁止显示

    托管代码分析工具检查在程序集、模块、类型、成员或参数级应用的 SuppressMessage 属性。它还针对资源和命名空间引发冲突。这些冲突必须在模块级应用,并且是有范围的。例如,下面的消息禁止显示命名空间冲突:

    [module: SuppressMessage("Microsoft.Naming", "CA1004:AvoidMisspelledNamespaces", Scope="namespace", Target="Microsoft.Design", Id="Fair")]

     

    任何禁止显示都可以通过指定一个显式范围来表示。这些禁止显示必须在模块级启用;但是,您不能通过修饰某个类型来指定成员级的禁止显示。对于引用并不映射到显式提供的用户源的编译器生成的代码的消息,模块级禁止显示是禁止显示它们的唯一方法。例如,下面的代码示例禁止显示针对编译器发出的构造函数的冲突:

     

    [module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]

    注意   目标始终包含完全限定的项名称。

  • 全局禁止显示文件

    全局禁止显示文件维护没有目标的禁止显示行为。例如,程序集级冲突存储在该文件中。此外,某些 ASP.NET 禁止显示之所以存储在该文件中,还因为项目级别设置对于代码隐藏的窗体不可用。

posted @ 2010-03-30 10:19  心随灵动  阅读(425)  评论(0编辑  收藏  举报