Share via


禁止显示代码分析违规情况

如果在创建代码时与团队协作,则表明警告不适用的做法通常很有用。 禁止显示代码分析违规情况向团队成员指示已评审代码,并且可以禁止显示警告。 以下各节介绍了使用 Visual Studio IDE 禁止显示代码分析违规情况的不同方法。

使用 EditorConfig 文件禁止显示违规情况

在解决方案或项目的 EditorConfig 文件中,为要配置的每个规则添加一个条目,并将其严重性设置为 none。 例如 dotnet_diagnostic.CA1822.severity = none。 有关详细信息,请参阅在 EditorConfig 文件中手动配置规则严重性。 若要添加 EditorConfig 文件,请参阅将 EditorConfig 文件添加到项目

禁止显示源代码中的违规情况

可以使用预处理器指令禁止显示源代码中的违规情况,从而禁止显示特定代码行的违规情况:

或者,可以使用 SuppressMessageAttribute 特性禁止显示 C# 和 Visual Basic 代码中的警告。

使用代码编辑器禁止显示违规情况

若要使用代码编辑器禁止显示违规情况,请执行以下步骤:

  1. 将光标放在有违规情况的代码行中,然后按 Ctrl+句点 (.)Alt+Enter 以打开“快速操作”菜单。

  2. 选择“禁止显示或配置问题”>“禁止显示 <规则编号>”,然后选择“在源中”或“在源中(特性)”

    • 如果选择“在源中”,则会看到添加到代码的预处理器指令的预览。

      显示“快速操作”“禁止显示”菜单中的“在源中”选择项的屏幕截图。

    • 如果选择“在源中(特性)”,则会看到添加到代码的 SuppressMessageAttribute 特性的预览。

      显示“快速操作”“禁止显示”菜单中的“在源中(特性)”选择项的屏幕截图。

使用错误列表禁止显示违规情况

若要使用“错误列表”窗口禁止显示违规情况,请执行以下步骤:

  1. 从“错误列表”窗口中,选择想要禁止显示的规则。

  2. 右键单击,然后选择“禁止显示”>“在源中”。

    打开“预览更改”对话框,并显示添加到源代码中的 C# #pragma warning directive 或 Visual Basic #Disable warning directive 的预览。

    显示用于在代码文件中添加 #pragma 警告的“预览更改”对话框的屏幕截图。

  3. 选择“应用”以保存对代码文件的更改。

排除错误列表生成诊断

如果在“错误列表”窗口中没有看到“禁止显示”菜单选项,则违规情况可能来自生成而非实时分析。 “错误列表”窗口显示来自实时代码分析和生成的诊断或规则冲突。 由于生成诊断可能已过时(例如已编辑代码以修复冲突,但没有重新生成代码),你无法始终从“错误列表”禁止显示这些诊断。

来自实时分析或 IntelliSense 的诊断始终是当前源的最新诊断,并且始终可以从“错误列表”中禁止显示。 若要从选择中排除生成诊断,请执行以下步骤:

  1. 从“错误列表”源筛选器下拉列表中,将选择项从“生成 + IntelliSense”更改为“仅 IntelliSense”。

    显示“错误列表”源筛选器的屏幕截图。

  2. 选择要禁止显示的诊断并按前面所述继续操作。

使用全局禁止显示文件禁止显示违规情况

全局禁止显示文件使用 SuppressMessageAttribute 特性禁止显示代码违规情况。

从代码编辑器使用全局禁止显示文件

若要通过代码编辑器使用全局禁止显示文件禁止显示违规情况,请执行以下步骤:

  1. 在代码编辑器中,将光标放在有违规情况的代码行上,然后按 Ctrl+句点 (.)Alt+Enter 以打开“快速操作”菜单

  2. 选择“禁止显示 <规则编号>”,然后选择“在禁止显示文件中”。

    Visual Studio 在代码编辑器中创建一个选项卡,其中包含新的全局禁止显示文件。

从错误列表使用全局禁止显示文件

若要通过“错误列表”窗口使用全局禁止显示文件禁止显示违规情况,请执行以下步骤:

  1. 从“错误列表”窗口中,选择想要禁止显示的规则。

  2. 右键单击,然后选择“禁止显示”>“在禁止显示文件中”

    此时会打开“预览更改”对话框,并显示添加到全局禁止显示文件的 SuppressMessageAttribute 特性的预览。

    显示禁止显示文件中具有 SuppressMessageAttribute 特性的“预览更改”对话框的屏幕截图。

  3. 选择“应用”以保存全局禁止显示文件。

禁止显示所有当前违规情况

禁止显示所有当前违规情况有时称为基线。 若要禁止显示解决方案或项目中的所有当前违规情况,请执行以下步骤:

  1. 在 Visual Studio 菜单栏中,选择“分析”>“生成和禁止显示活动问题”。

  2. 选择“针对解决方案”可禁止显示整个解决方案的违规情况,或选择“针对 <项目名称>”可仅禁止显示项目的违规情况。

使用项目设置禁止显示违规情况

若要使用解决方案资源管理器项目设置禁止显示违规情况,请执行以下步骤:

  1. 从“解决方案资源管理器”中,选择你的项目。

  2. 右键单击,然后选择“属性”(或按 Alt + Enter)。

  3. 在“属性”窗口中,从左侧窗格中选择“代码分析”,然后清除“禁止显示由生成代码产生的结果”。

使用规则集禁止显示违规情况

从规则集编辑器中,清除其名称旁边的复选框,或将“操作”设置为“无”。

源内禁止显示和 SuppressMessageAttribute 特性

源内禁止显示 (ISS) 使用 SuppressMessageAttribute 特性来禁止显示警告。 可以将特性 SuppressMessageAttribute 添加到源文件中生成警告的代码段附近。

可以在代码编辑器中手动输入特性,也可以按如下所示自动添加特性:

  1. 在代码编辑器中,将光标放在有违规情况的代码行上,然后按 Ctrl+句点 (.)Alt+Enter 以打开“快速操作”菜单

  2. 从“快速操作”菜单中选择“禁止显示或配置问题”>“禁止显示 <规则编号>”。

  3. 执行以下步骤之一:

    • 选择“在源中(特性)”

      Visual Studio 向代码中添加特性 SuppressMessageAttribute

    • 选择“在禁止显示文件中”

      Visual Studio 在代码编辑器中创建一个选项卡,其中包含新的具有 SuppressMessageAttribute 特性的全局禁止显示文件。

SuppressMessageAttribute 特性是一个条件特性,其包含在托管代码程序集的元数据中。 仅当 CODE_ANALYSIS 编译符号是在编译时定义的,才会包含此特性。

仅在 C++ 和 CLI 代码中,在头文件中使用宏 CA_SUPPRESS_MESSAGECA_GLOBAL_SUPPRESS_MESSAGE 以添加此特性。

如果将项目迁移到最新版本的 Visual Studio,可能会突然看到大量代码分析警告。 如果尚未准备好处理警告,可选择“分析”>“生成并禁止显示待处理的问题”来禁止显示所有警告 。

注意

不要在发布版本上使用源内禁止显示,以防止意外传送源内禁止显示元数据。

SuppressMessageAttribute 特性格式

SuppressMessageAttribute 特性采用以下格式:

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

该特性的属性包括:

  • Category:规则的类别。 有关代码分析规则类别的详细信息,请参阅代码质量规则

  • CheckId::规则的标识符。 支持包括规则标识符的短名称和长名称。 短名称为 CAXXXX;长名称为 CAXXXX:FriendlyTypeName

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

  • MessageId:每条消息的问题的唯一标识符。

  • Scope:要禁止显示警告的目标。 如果未指定目标,系统会将其设置为特性的目标。 支持的范围包括:

    • module:此范围禁止显示针对程序集的警告。 它是应用于整个项目的全局禁止显示。

    • resource:(仅旧版 FxCop)此范围禁止显示在写入到属于模块(程序集)一部分的资源文件中的诊断信息的警告。 在仅分析源文件的 Roslyn 分析器诊断的 C#/VB 编译器中不读取或遵守此范围。

    • type:此范围禁止显示针对类型的警告。

    • member:此范围禁止显示针对成员的警告。

    • namespace:此范围禁止显示针对命名空间本身的警告。 它不会禁止显示针对命名空间中的类型的警告。

    • namespaceanddescendants:(需要编译器版本 3.x 或更高版本以及 Visual Studio 2019 或更高版本)此范围禁止显示命名空间及其所有后代符号中的警告。 旧版分析忽略 namespaceanddescendants 值。

  • Target:一个标识符,用于指定要禁止显示警告的目标。 它必须包含完全限定的组件名称。

在 Visual Studio 中看到警告时,可以通过向全局禁止显示文件添加禁止显示来查看 SuppressMessageAttribute 的示例。 禁止显示特性及其必需属性显示在预览窗口中。

SuppressMessageAttribute 使用情况

代码分析警告在应用 SuppressMessageAttribute 特性的级别禁止显示。 例如,可以在程序集、模块、类型、成员或参数级别应用该特性。 应用此特性的目的是将禁止显示信息与发生违规情况的代码紧密耦合。

禁止显示的一般形式包括规则类别和规则标识符,其中包含规则名称的可选人工可读取的表示形式。 例如:

[SuppressMessage("Microsoft.Design", "CA1039:ListsAreStrongTyped")]

如果出于严格的性能原因来最小化源内禁止显示元数据,可以省略规则名称。 规则类别及其规则 ID 共同构成了足够唯一的规则标识符。 例如:

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

出于可维护性原因,不建议省略规则名称。

禁止显示方法主体中的选择性违规情况

禁止显示特性可以应用于方法,但不能嵌入在方法主体中。 如果将 SuppressMessageAttribute 特性添加到方法,将禁止显示特定规则的所有违规情况。

在某些情况下,你可能想要禁止显示特定违规情况的实例。 请考虑以后的代码不会自动从代码分析规则中免除的示例。 某些代码分析规则允许通过使用 SuppressMessageAttribute 特性的 MessageId 属性来禁止显示特定违规情况的实例。 通常,针对特定符号(局部变量或参数)的违规情况的旧规则遵守 MessageId 属性。 CA1500:VariableNamesShouldNotMatchFieldNames 就是此类规则的一个示例。 但是,针对可执行代码(非符号)的违规情况的旧规则不遵守 MessageId 属性。 此外,.NET Compiler Platform(“Roslyn”)分析器不遵守 MessageId 特性。

若要禁止规则的特定符号违规情况,请为 SuppressMessageAttribute 特性的 MessageId 属性指定符号名称。 以下示例显示了存在两次 CA1500:VariableNamesShouldNotMatchFieldNames 违规情况的代码 一次是针对 name 变量,另一次是针对 age 变量。 仅禁止显示 age 符号的违规情况。

public class Animal
{
    int age;
    string name;

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "age")]
    private void PrintInfo()
    {
        int age = 5;
        string name = "Charlie";

        Console.WriteLine($"Age {age}, Name {name}");
    }
}

全局级禁止显示

托管代码分析工具检查在程序集、模块、类型、成员或参数级别应用的 SuppressMessageAttribute 特性。 它还针对资源和命名空间提交违规情况。 这些违规情况必须在全局级别应用,并且具有范围和目标。 例如,以下消息禁止显示命名空间违规情况:

[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]

对于全局级禁止显示:

  • 禁止显示具有 namespace 范围的警告时,会禁止显示针对命名空间本身的警告。 它不会禁止显示针对命名空间中的类型的警告。

  • Target 始终包含完全限定的项名称。

  • 可以通过指定显式范围来表示任何禁止显示。 这些禁止显示必须位于全局级别。 不能通过修改类型来指定成员级别的禁止显示。

  • 全局级别的禁止显示是禁止显示引用编译器生成的代码的消息的唯一方法,这些代码未映射到显式提供的用户源。 例如,下面的代码将抑制针对编译器发出的构造函数的冲突:

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

全局禁止显示文件

全局禁止显示文件保留全局级别的禁止显示或未指定目标的禁止显示。 例如,程序集级别的违规情况的禁止显示存储在此文件中。 此外,一些 ASP.NET 禁止显示存储在此文件中,因为项目级别的设置不适用于窗体后面的代码。 第一次在“错误列表”窗口中选择“禁止显示”命令的“在项目禁止显示文件中”选项时,Visual Studio 会创建一个全局禁止显示文件并将其添加到你的项目中。

模块禁止显示范围

可以使用 module 范围禁止显示整个程序集的代码质量违规情况。

例如,GlobalSuppressions 项目文件中的以下特性将禁止显示 ASP.NET Core 项目的 ConfigureAwait 违规情况:

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Reliability", "CA2007:Consider calling ConfigureAwait on the awaited task", Justification = "ASP.NET Core doesn't use thread context to store request context.", Scope = "module")]

生成的代码

托管代码编译器和某些外部工具会生成代码,以便加快代码开发速度。 在源文件中出现的编译器生成的代码使用 GeneratedCodeAttribute 特性进行标记。

对于源代码分析,可以在 .editorconfig 文件中禁止显示生成的代码中的消息。 有关详细信息,请参阅排除生成的代码

对于旧版代码分析,可以选择是否禁止显示生成的代码的代码分析警告和错误。 有关如何禁止显示此类警告和错误的信息,请参阅禁止对生成的代码显示代码分析警告

注意

GeneratedCodeAttribute 应用于整个程序集或单个参数时,代码分析会忽略它。