分享

System.Diagnostics.CodeAnalysis.SuppressMessa...

 xiaoxiaollll 2010-12-05

System.Diagnostics.CodeAnalysis.SuppressMessage 源代码中禁止显示

已有 479 次阅读  2009-08-04 14:03


通常最好指出警告不适用于代码,这样小组成员可以知道代码已经过检查并已决定取消警告。源代码中禁止显示 (ISS) 功能允许开发人员将取消警告的代码放在靠近警告本身的位置。

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

检查代码之后,您可能确定代码是正确的。也可能是以下情况,即某些冲突的优先级较低,因此不会在当前的开发周期中修复。无论出于何种原因,以下操作通常是有用的,即指出相应警告不适用,以使小组成员了解代码已经过检查并已决定取消警告。“源代码中禁止显示”(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 禁止显示之所以存储在该文件中,还因为项目级别设置对于代码隐藏的窗体不可用。

 

如何:使用菜单项禁止显示警告

检查代码之后,您可能已经确定代码是正确的。也有可能是这样一种情况:某些冲突的优先级较低,将不会在当前的开发周期中修复。无论原因是什么,通常最好指出警告不适用于代码,这样小组成员可以知道代码已经过检查并已决定禁止显示警告。“在源代码中禁止显示”功能很有用,因为开发人员可以将禁止显示警告的修饰内容放在靠近警告本身的位置。

您可以使用“错误列表”窗口来禁止显示托管代码分析警告。禁止显示警告与禁用警告不同。禁止显示警告时,仅应用于冲突的特定实例。“错误列表”窗口中仍会报告相同警告的其他冲突。

使用菜单项禁止显示警告
在“错误列表”中,选择警告。

右击警告,然后选择“禁止显示消息”。

将禁止显示特定警告,并且此类警告在“错误列表”窗口中显示时会带有一条删除线。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多