如何抑制 StyleCop 警告?

Posted

技术标签:

【中文标题】如何抑制 StyleCop 警告?【英文标题】:How to suppress a StyleCop warning? 【发布时间】: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 是由受虐狂编写的,因此您必须手动解决所有问题,非常繁琐。如果曾经有设计由机器完成的工作,就是这样。真是浪费。 【参考方案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 未找到。 他们的文档在这里更新:github.com/DotNetAnalyzers/StyleCopAnalyzers/tree/master/…【参考方案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 不支持全局抑制或 文件级抑制。抑制必须放在代码上 元素。

【讨论】:

这里也提供了相同的信息 - blogs.msdn.com/b/sourceanalysis/archive/2009/08/10/…【参考方案4】:

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

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

【讨论】:

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

【讨论】:

【参考方案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

【讨论】:

以上是关于如何抑制 StyleCop 警告?的主要内容,如果未能解决你的问题,请参考以下文章

如何抑制 LLVM 自动合成警告?

如何在 Kotlin 中抑制检查式警告

如何抑制龙目岛警告

如何抑制蜂巢警告

如何抑制更新链接警告?

如何使用 Intellij SonarLint 插件抑制特定方法的警告