2009-09-03 130 views
5

我使用StyleCop和FxCop工具來改進我的代碼,但是我來到了有兩條規則的地方,一條是StyleCop,一條是FxCop,互相排斥。如果我修復我的代碼以匹配StyleCop的規則,那麼FxCop驗證將失敗,反之亦然。StyleCop和FxCop規則互相排斥

第一條規則是StyleCop的SA1200,它表示所有使用指令必須放置在命名空間內。

所有使用指令都必須放在命名空間中。

所以我做了這樣的事情

namespace MyNamespace 
{ 
    using System; 

    ... 
} 

這是確定的了StyleCop,沒有更多的警告。現在我運行FxCop驗證,它告訴我違反了CA1014:

標記'MyApp.dll'與CLSCompliant(true),因爲它暴露了外部可見類型。

要解決此我應該做這樣的事情:

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

但現在因爲ClsCompliant屬性不承認我不能建立我的項目(因爲它是從System命名空間,我包括MyNamespace內的) 。所以如果我在MyNamespace聲明之外移動using System;指令。這將使我的代碼編譯,但它會再次違反StyleCop的規則。

除了禁用StyleCop或FxCop中的規則之外,是否有任何方法可以解決此問題?如果這是不可能的,我應該禁用哪些規則?哪個不重要?

回答

15

使用完整的屬性名:

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

順便說一句:如果你想標記您的整個裝配爲CLSCompliant,把

[assembly: System.CLSCompliant(true)] 

在性能/ AssemblyInfo.cs文件

+4

我認爲應該將程序集標記爲maciejkow指出的CLSCompliant,而不是標記符合的命名空間。 – 2010-03-14 15:37:18

3

我的建議是關閉「所有使用指令必須放置在命名空間內」。規則在StyleCop中。遵守它是不切實際的,特別是因爲大多數代碼生成器(甚至是VS自己的代碼生成器)都不遵循這種做法。

+0

我認爲最好將StyleCop設置爲忽略生成的文件。 – RaYell 2009-09-12 16:44:04

+2

是的,如果它們標有適當的屬性。不幸的是,一些代碼生成器不會標記生成的代碼。 – 2009-09-13 07:40:27