CA2011: セッター内でプロパティを割り当てません

プロパティ
ルール ID CA2011
Title セッター内でプロパティを割り当てません
[カテゴリ] 信頼性
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

プロパティの set アクセサー内でプロパティに値が誤って割り当てられました。

規則の説明

set アクセサーでプロパティをそれ自体に割り当てると、set アクセサーへの再帰呼び出しを行う無限チェーンになります。 この結果、実行時に StackOverflowException が発生します。 このような誤りは、プロパティの値を格納するためのプロパティとバッキング フィールドの名前が似ている場合によく見られます。 バッキング フィールドに値を割り当てる代わりに、誤ってプロパティ自体に割り当ててしまっています。

違反の修正方法

違反を修正するには、違反しているプロパティへの割り当てを、バッキング フィールドへの割り当てに置き換えるか、自動プロパティを使用するように切り替えます。 たとえば、次のコード スニペットでは、規則違反とその修正方法を何通りか示します。

public class C
{
    // Backing field for property 'P'
    private int p;

    public int P
    {
        get
        {
            return p;
        }
        set
        {
            // CA2011: Accidentally assigned to property, instead of the backing field.
            P = value;
        }
    }
}
public class C
{
    // Backing field for property 'P'
    private int _p;

    public int P
    {
        get
        {
            return _p;
        }
        set
        {
            // Option 1: Assign to backing field and rename the backing field for clarity.
            _p = value;
        }
    }
}
public class C
{
    // Option 2: Use auto-property.
    public int P { get; set; }
}

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

set アクセサーへの再帰呼び出しが、無限再帰を防ぐように条件付きで保護されている場合は、この規則に違反しないように十分注意してください。

警告を抑制する

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

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

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

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

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

関連項目