【问题标题】:How do I suppress StyleCop warning SA1403?如何抑制 StyleCop 警告 SA1403?
【发布时间】:2012-11-11 03:12:05
【问题描述】:

考虑一下这段代码,它包含在一个文件中:

namespace Foo
{
    public partial class One
    {
    }
}

namespace Baa
{
    public partial class Two
    {
    }
}

编译此代码会导致两个 StyleCop 警告:

  • SA1402:FileMayOnlyContainASingleClass
  • SA1403:FileMayOnlyContainASingleNamespace

抑制 SA1402 按预期工作:

namespace Foo
{
    [SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleClass")]
    public partial class One
    {
    }
}

namespace Baa
{
    [SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleClass")]        
    public partial class Two
    {
    }
}

不幸的是,我似乎无法抑制 SA1403。

我已经在每个类上方尝试了以下抑制(根据 SA1402 抑制):

[SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace")]

我还在文件顶部和全局抑制文件中尝试了以下程序集级抑制(我意识到这不是一个明智的想法):

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace")]

但无济于事。

所以,我的问题是:如何抑制 StyleCop 警告 SA1403?

谢谢,

E

附:请抑制提醒我单个文件中的多个命名空间表明不良编程习惯的冲动...

编辑(20121127): 根据 Mightymuke 的回答,我研究了使用 SourceFileList 的可能性。

我们在构建中使用StyleCopOverrideSettingsFile 标记,它指向一个共享规则文件。根据 Mightymuke 的建议,我在我们的文件中添加了以下内容:

  <SourceFileList>
    <SourceFile>MyFileName.cs</SourceFile>
    <Settings>
      <Analyzers>
        <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">
          <Rules>
            <Rule Name="FileMayOnlyContainASingleNamespace">
              <RuleSettings>
                <BooleanProperty Name="Enabled">False</BooleanProperty>
              </RuleSettings>
            </Rule>
          </Rules>
        </Analyzer>
      </Analyzers>
    </Settings>
  </SourceFileList>

这也不起作用。

我相信,但这可能是设计使然。我发现了一个StyleCop bug report,它表明SourceFileList 标签不能用于高于项目级别的级别。

考虑到这些信息,我尝试在项目级别添加一个Settings.StyleCop 文件。

还是不开心。

我现在正在调查StyleCopOverrideSettingsFile 标签是否会取消所有其他设置文件。这似乎是合乎逻辑的,但如果是这样,我所看到的行为将意味着不可能在也使用StyleCopOverrideSettingsFile 的构建中使用SourceFileList。 或者,可能只是 Settings.StyleCop 是错误的文件名,或者我把它放在了错误的位置(我把它放在 csproj 文件旁边。

编辑(20130425):

最后我放弃了。有问题的代码是由 Visual Studio 模板文件 (.TT) 自动生成的,因此我付出了额外的努力,使模板代码将命名空间拆分为单独的文件。

【问题讨论】:

  • 在单个文件中使用多个命名空间演示了 ba......哦,你已经说过了:P。说真的,StyleCop 可以帮助您避免不良做法,但是您想忽略它并仍然这样做吗?你反对使用它:)。

标签: c# stylecop


【解决方案1】:

您需要在设置文件中创建一个File List

来自文档:

Now consider a situation where you’d like to disable some additional rules for a
couple of specific files in the project, Class3.cs and Class4.cs. In StyleCop
4.4, this can be accomplished by adding a <SourceFileList> section within the
settings file:
<SourceFileList>
  <SourceFile>Class3.cs</SourceFile>
  <SourceFile>Class4.cs</SourceFile>
  <Settings>
    <Analyzers>
      <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">
        <Rules>
          <Rule Name="AccessModifierMustBeDeclared">
            <RuleSettings>
              <BooleanProperty Name="Enabled">False</BooleanProperty>
            </RuleSettings>
          </Rule>
        </Rules>
      </Analyzer>
    </Analyzers>
  </Settings>
</SourceFileList>

在您的具体情况下,它应该类似于:

<SourceFileList>
  <SourceFile>YourFile.cs</SourceFile>
  <Settings>
    <Analyzers>
      <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">
        <Rules>
          <Rule Name="FileMayOnlyContainASingleClass">
            <RuleSettings>
              <BooleanProperty Name="Enabled">False</BooleanProperty>
            </RuleSettings>
          </Rule>
          <Rule Name="FileMayOnlyContainASingleNamespace">
            <RuleSettings>
              <BooleanProperty Name="Enabled">False</BooleanProperty>
            </RuleSettings>
          </Rule>
        </Rules>
      </Analyzer>
    </Analyzers>
  </Settings>
</SourceFileList>

【讨论】:

  • 有趣,我不知道这个。
【解决方案2】:

您需要设置抑制的范围。在这种情况下,请使用“模块”。

[module: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace", Justification = "This is a generated file which generates all the necessary support classes.")]

我从下一页的“全局级别抑制”部分了解到这一点: http://msdn.microsoft.com/en-us/library/ms244717.aspx#sectionToggle4

【讨论】:

    【解决方案3】:

    我找到了更简单的方法,也许它可以帮助某人。 您可以右键单击您的项目并选择StyleCop Settings

    弹出窗口将打开,您可以在其中自定义警告并选择要禁止显示的内容。在您的情况下,可以在维护性规则\文件内容中找到交战 SA1403

    【讨论】:

      【解决方案4】:

      如果这是针对生成的文件,您只需在项目属性下的代码分析部分中选中“抑制生成代码的结果”框即可

      【讨论】: