CA2011: セッター内でプロパティを割り当てません
プロパティ | 値 |
---|---|
ルール ID | CA2011 |
Title | セッター内でプロパティを割り当てません |
[カテゴリ] | 信頼性 |
修正が中断ありか中断なしか | なし |
.NET 9 では既定で有効 | 提案として |
原因
プロパティの 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
詳細については、「コード分析の警告を抑制する方法」を参照してください。
関連規則
関連項目
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET