【问题标题】:How to suppress a StyleCop warning?如何抑制 StyleCop 警告?
【发布时间】:2011-03-18 06:57:33
【问题描述】:

我正在使用 StyleCop 并想取消一些不适合我的风格的警告。我更喜欢有解决方案

1) 内嵌代码抑制
2) 全局设置抑制

我已经搜索了互联网,但still not sure 如何进行抑制。

对于方法1),他们说要添加行:

[程序集:SuppressMessage("Microsoft.Design", "SA1202:所有私有方法必须放在所有公共方法之后", 范围=“命名空间”,目标=“Consus.Client.ClientVaultModule.Services.OnlineDetection”)]

但他们没有说明要使用的位置和名称空间。

对于方法 2),他们说要使用 GlobalSuppress 文件,但目前似乎不太容易搜索操作方法。

请帮忙。

[已编辑] 就我而言,我收到了关于 SA1202:所有私有方法必须放在所有公共方法之后 的警告,这很麻烦,因为我将相关代码分组到区域中。我想仅针对某些特定方法抑制这些警告。

【问题讨论】:

  • 理想情况下,右键单击,“抑制”(或右键单击,“修复”)。但是 StyleCop 是由受虐狂编写的,因此您必须手动解决所有问题,非常繁琐。如果曾经有设计由机器完成的工作,就是这样。真是浪费。

标签: c# .net visual-studio-2010 stylecop


【解决方案1】:

这是你需要的:

[SuppressMessage("Microsoft.StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess")]

【讨论】:

  • 那两条魔线是怎么推导出来的?发布的所有 OP 都是代码“SA1202”。我有一个类似的问题(代码'SP0100'),我无法推断出相应的字符串。
  • @Colonel Panic:您可以在运行 StyleCop 警告消息时获取第一个字符串。例如。 “SA1202:CSharp.OrderingRules:blahblah”。然后使用编辑器打开 StyleCop 设置文件并使用 SA 代码搜索以找到实际规则及其简称。
  • 如果您转到stylecop.com/docs/SA1202.html(或其他警告的类似页面网址),您可以找到抑制消息语法的非常清晰的详细信息。
  • @Seph Alas,不适用于我的 Style Cop 信天翁“SP0100”。 stylecop.com/docs/SP0100.html 的网页是 404 未找到。
【解决方案2】:

内联抑制的示例与此类似 - 检查代码中的命名空间与抑制相比

namespace Soapi
{
        ///<summary>
        ///</summary>
        ///<param name = "message"></param>
        ///<param name = "statusCode"></param>
        ///<param name = "innerException"></param>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object,System.Object)")]
        public ApiException(string message, ErrorCode statusCode, Exception innerException)
            : base(String.Format("{0}\r\nStatusCode:{1}", message, statusCode), innerException)
        {
            this.statusCode = statusCode;
        }

全局抑制文件是项目根目录中名为 GlobalSuppressions.cs 的文件,可能如下所示:

// This file is used by Code Analysis to maintain SuppressMessage 
// attributes that are applied to this project. 
// Project-level suppressions either have no target or are given 
// a specific target and scoped to a namespace, type, member, etc. 
//
// To add a suppression to this file, right-click the message in the 
// Error List, point to "Suppress Message(s)", and click 
// "In Project Suppression File". 
// You do not need to add suppressions to this file manually. 

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object,System.Object,System.Object)", Scope = "member", Target = "Soapi.ApiException.#.ctor(System.String,Soapi.ErrorCode,System.String,System.Exception)")]

您可以通过右键单击警告自动生成此代码。

【讨论】:

  • 我尝试右键单击警告(在错误/警告列表中),但没有上下文菜单项允许我抑制它。我正在使用 VS 2010。你知道为什么吗?
  • @Nam - 不确定,我举的例子是使用 vs2008。让我启动 2010 年并看一看。
  • @poet:我已经在这里发布了我的相关问题*.com/questions/3287957/…
  • @Nam - 与 2010 相比有一些问题 - 需要几个小时。如果你还没有得到一个好的答案,那么我会报告回来。但实际上它应该是非常相似的过程。到那时..
  • 嗯,我猜你不能在 StyleCop 警告中使用上下文菜单。我展示的那些来自 FxCop。但是 - 抑制语法是相同的。所以我猜你的问题是找到你正在打破的规则的命名空间,以便你可以手动抑制,对吧?
【解决方案3】:

从 StyleCop 4.3.2 开始,可以通过在源代码中添加抑制属性来抑制违反规则的报告。

规则抑制 http://stylecop.soyuz5.com/Suppressions.html

但它说-

全局抑制

StyleCop 不支持全局抑制或 文件级抑制。抑制必须放在代码上 元素。

【讨论】:

【解决方案4】:

如果你已经安装了 StyleCop,你可以右击你的项目,会有一个 StyleCop 选项。单击此按钮,您将看到您甚至可以阻止某些规则对您的项目运行。此外,您可以创建单独的规则文件以在不同项目之间共享。这意味着您可以按照自己的方式配置规则,然后在所有项目之间共享该配置。

对于个人覆盖,SuppressMessage 是可行的方法。

【讨论】:

  • 在 VS 2019 中你不能再这样做了。
  • 我正在使用 Visual Studio 2019,版本 16.7.3 并确认 @aBlaze 的建议不起作用
【解决方案5】:
  1. 转到解决方案资源管理器
  2. 转到您的项目
  3. 扩展参考文献
  4. 扩展分析器
  5. 扩展 StyleCop.Analyzers
  6. 右键单击要在全局(项目)级别禁用的特定规则
  7. 设置规则集严重性 -> 选择无

【讨论】:

    【解决方案6】:

    阅读 Style Cop 的警告,寻找字母数字代码。在你的情况下'SA1202'。然后浏览到 Style Cop 网站上的相应页面。酌情更改网址https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1202.md

    复制标有“如何禁止违规”的行。将属性粘贴到 Style Cop 抱怨的类上方

    [SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess", Justification = "Reviewed.")]
    

    【讨论】:

      【解决方案7】:

      您不能只删除规则而不污染您的代码吗?

      FxCop 也是如此...

      【讨论】:

      • 我刚刚添加了我无法获取代码的原因。请查看我编辑的问题。
      【解决方案8】:

      1。 在您的情况下,正确的 SuppressMessage 属性应如下所示:

      [SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess")]
      private void SomeMethod()
      {
      }
      

      请注意,您可以将它放在任何其他元素上(例如,放在类上 - 然后整个类中的所有类似违规行为都将被禁止)。

      我也同意在这些字段中写什么是相当不明显的。

      实际上,第一个应该是StyleCop 分析器类 的完全限定名称,可以从源代码中找到(例如来自here)。 第二个应该以 rule code 开头,然后是冒号和 rule enumeration 的名称(幸运的是,它总是看起来像设置编辑器中显示的规则名称,但带有没有空格)。

      2。 关于“全局”抑制规则 - 为什么不通过设置编辑器将它们关闭?设置文件是通过文件系统继承的,因此您可以轻松地在文件夹结构的“顶部”拥有一个“主”设置文件,以及一些其他文件(与主文件保持“差异”),但某些项目除外,如果您愿意(如here 所述)。

      祝你好运!

      【讨论】:

        【解决方案9】:

        您可以在项目根文件夹中的 Settings.StyleCop 文件中禁用不需要的规则。 您将需要包含规则的命名空间,可在此处找到: http://stylecop.soyuz5.com/StyleCop%20Rules.html

        Settings.stylecop 文件代码供大家参考:

        <StyleCopSettings Version="105">
          <Analyzers>
            <Analyzer AnalyzerId="StyleCop.CSharp.LayoutRules">
              <Rules>
                <Rule Name="ElementsMustBeSeparatedByBlankLine">
                  <RuleSettings>
                    <BooleanProperty Name="Enabled">False</BooleanProperty>
                  </RuleSettings>
                </Rule>
              </Rules>
              <AnalyzerSettings />
            </Analyzer>
          </Analyzers>
        </StyleCopSettings>
        

        【讨论】:

        • 如果您可以显示一些 OP 可能需要的示例设置,这将更有帮助。
        【解决方案10】:

        或者,您可以将区域中的代码移动到部分类中。那么 stylecop 规则的问题就会消失。

        【讨论】:

          【解决方案11】:

          除了已有的有用答案:

          如果您在抑制文件GlobalSuppressions.cs 中抑制警告, 您可以编辑 [assembly: SuppressMessage(StyleCop...blabla 行并完全删除 Scope=...Target=... 标记。这使得抑制在项目中成为全局性的。

          【讨论】:

            【解决方案12】:

            Visual Studio 2015+ 使用的StyleCop.Analyzers NuGet 包的README.md 包含指向documentation for the rules 的链接。每个规则的文档都包含“如何禁止违规”部分。对于SA1202 rule,选项有:

            [SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1202:ElementsMustBeOrderedByAccess", Justification = "Reviewed.")]
            

            #pragma warning disable SA1202 // ElementsMustBeOrderedByAccess
            #pragma warning restore SA1202 // ElementsMustBeOrderedByAccess
            

            【讨论】: