5

私はこのようなクラスを持っています:

public class Foo
{
    public readonly int A = 1;
    public readonly int B = 2;
}

コード分​​析ツールに組み込まれた VS2010 を実行すると、2 つの同一の警告が表示されます。その「フィールド '...' は、その宣言型の外側に表示されます。そのアクセシビリティをプライベートに変更し、フィールドと同じアクセシビリティでプロパティを追加します。現在、それへのアクセスを提供するために'.

クラスFooのすべてのフィールドに対してこの警告を抑制したいのですが、次のようにすべてのフィールドを SuppressMessage 属性でマークしたくありません。

public class Foo
{
    [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
    public readonly int A = 1;
    [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
    public readonly int B = 2;
}

次のようなコードを使用して、すべてのクラス メンバーをマークしたいと思います。

[SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
public class Foo
{
    public readonly int A = 1;
    public readonly int B = 2;
}

しかし、このコードは機能しません。コード分析の警告が表示されます。どうすれば正しくできますか?

4

2 に答える 2

10

SuppressMessageAttributeを使用して、一度に複数のメッセージを抑制する方法はありません。

議論はここにありますが、関連する部分は次のとおりです。

あなたはSuppressMessageについての一般的な誤解に遭遇しています。

SuppressMessageをソースファイルに入れるたびに、1つの問題(グリッド内の1つの「行」)を抑制します。限目。

SuppressMessageは、違反の「近く」またはモジュールレベルのいずれかに配置できます。モジュールレベル、アセンブリレベル、およびグローバル抑制はすべて同じことを意味します。モジュールレベルで配置することにより、問題の複数のインスタンスを一度に抑制しません。SuppressMessageをコードの別の場所に配置するだけです。主な利点は、たとえば、アセンブリに関連するすべての抑制を1つのファイル(たとえば、GlobalSuppressions.cs)に収集できることです。

モジュールレベルのSuppressMessageを使用する場合は、ターゲットを指定する必要があります。ターゲットは、ルール違反についてGUIで報告されたものと正確に一致する必要があります。

SuppressMessageを使用して、クラスのスコープ全体または名前空間のスコープ全体のルールを抑制する方法はありません。

于 2011-08-17T12:38:35.523 に答える
1

次のような一連のルールを使用して、CodeAnalysis ルール ファイルを作成できます。

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0">
  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis"
         RuleNamespace="Microsoft.Rules.Managed">
    <Rule Id="CA1111" Action="Ignore" />
  </Rules>
</RuleSet>

ステップ バイ ステップのチュートリアルを参照してください。

于 2011-08-17T12:45:53.810 に答える