【问题标题】:StyleCop and FxCop rules exclude each otherStyleCop 和 FxCop 规则相互排斥
【发布时间】:2010-11-25 05:00:41
【问题描述】:

我正在使用 StyleCop 和 FxCop 工具来改进我的代码,但我遇到了一个有两条规则的地方,一条在 StyleCop 中,一条在 FxCop 中,它们相互排斥。如果我修复我的代码以匹配来自 StyleCop 的规则,则 FxCop 验证失败,反之亦然。

第一条规则是来自 StyleCop 的 SA1200,它规定所有 using 指令都必须放在命名空间内。

所有 using 指令都必须放在命名空间内。

所以我做了这样的事情

namespace MyNamespace
{
    using System;

    ...
}

StyleCop 没问题,没有更多警告。现在我运行 FxCop 验证,它告诉我违反了 CA1014:

使用 CLSCompliant(true) 标记“MyApp.dll”,因为它公开了外部可见的类型。

要解决这个问题,我应该这样做:

[ClsCompliant(true)]
namespace MyNamespace
{
    ...
}

但现在我无法构建我的项目,因为无法识别ClsCompliant 属性(因为它来自System 命名空间,我将其包含在MyNamespace 中)。因此,如果我将 using System; 指令移到 MyNamespace 声明之外。这将使我的代码编译,但它会再次违反 StyleCop 的规则。

除了禁用 StyleCop 或 FxCop 中的规则之一,还有什么方法可以解决这个问题?如果这不可能,我应该禁用哪些规则?哪个不太重要?

【问题讨论】:

    标签: c# .net coding-style fxcop stylecop


    【解决方案1】:

    我的建议是关闭“所有 using 指令必须放在命名空间内”。 StyleCop 中的规则。坚持它是不切实际的,特别是因为大多数代码生成器(甚至是 VS 自己的)都不遵循这种做法。

    【讨论】:

    • 我认为最好将 StyleCop 设置为忽略生成的文件。
    • 是的,如果它们标有适当的属性。不幸的是,一些代码生成器没有标记生成的代码。
    【解决方案2】:

    使用完整的属性名:

    [System.CLSCompliant(true)]
    namespace MyNamespace
    {
        ...
    }
    

    顺便说一句:如果您想将整个程序集标记为 CLSCompliant,请放置

    [assembly: System.CLSCompliant(true)]
    

    在 Properties/AssemblyInfo.cs 文件中

    【讨论】:

    • 我认为程序集应该被标记为 CLSCompliant,就像 maciejkow 指出的那样,而不是标记命名空间兼容。