CA1051:参照可能なインスタンス フィールドを宣言しません

プロパティ
ルール ID CA1051
Title 参照可能なインスタンス フィールドを宣言しません
[カテゴリ] デザイン
修正が中断ありか中断なしか あり
.NET 8 では既定で有効 いいえ

原因

型に、プライベートでないインスタンス フィールドがあります。

既定では、この規則の対象は外部から参照可能な型のみですが、これは構成可能です。

規則の説明

フィールドの主な用途は、実装の詳細にする必要があります。 フィールドは private または internal にし、プロパティを使用して参照可能にする必要があります。 プロパティには、フィールドにアクセスするのと同じように簡単にアクセスできます。そしてプロパティのアクセサーのコードは、型の機能が拡張されると破壊的変更を導入することなく変更できます。

プライベートまたは内部フィールドの値のみを返すプロパティは、フィールドへのアクセスと同等に動作するように最適化されています。プロパティではなく、外部から参照可能なフィールドを使用することによるパフォーマンスの向上は最小限です。 "外部から参照可能" とは、publicprotected、および protected internal (Visual Basic の PublicProtected、および Protected Friend) のアクセシビリティ レベルを言います。

また、パブリック フィールドは、リンク確認要求で保護できません。 (リンク確認要求は .NET Core アプリには該当しません)。

違反の修正方法

この規則違反を修正するには、フィールドを private または internal に設定し、外部から参照可能なプロパティを使用して公開します。

どのようなときに警告を抑制するか

この警告は、使用者が確実にフィールドに直接アクセスする場合にのみ表示しないようにします。 参照可能なフィールドは、ほとんどのアプリケーションで、パフォーマンスや保守性の面でプロパティに劣ります。

使用者は、次の状況でフィールドにアクセスする必要があります。

  • ASP.NET Web Forms のコンテンツ コントロール。
  • (WPF および UWP 用の Model-View-ViewModel (MVVM) フレームワークなど) ターゲット プラットフォームがフィールドの変更に、ref を使用する場合。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA1051
// The code that's violating the rule is on this line.
#pragma warning restore CA1051

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA1051.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。

API を含めるまたは除外する

次のオプションを使用して、コードベースのどの部分に対してこのルールを実行するかを構成します。

これらのオプションを構成できる対象は、この規則だけ、それを適用するすべての規則、それを適用するこのカテゴリ (デザイン) のすべての規則のいずれかです。 詳細については、「コード品質規則の構成オプション」を参照してください。

特定の API サーフェイスを含める

ユーザー補助に基づいて、この規則を実行するコードベースの部分を構成できます。 たとえば、非パブリック API サーフェイスでのみ規則を実行するように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CAXXXX.api_surface = private, internal

構造体を除外する

struct (Visual Basic の Structure) フィールドを分析の対象から除外できます。

dotnet_code_quality.ca1051.exclude_structs = true

次は、この規則に違反する型 (BadPublicInstanceFields) の例を示しています。 修正したコードは、GoodPublicInstanceFields です。

public class BadPublicInstanceFields
{
    // Violates rule DoNotDeclareVisibleInstanceFields.
    public int instanceData = 32;
}

public class GoodPublicInstanceFields
{
    private int instanceData = 32;

    public int InstanceData
    {
        get { return instanceData; }
        set { instanceData = value; }
    }
}

関連項目