| 属性 | 值 |
|---|---|
| 规则 ID | CA2011 |
| 标题 | 请勿在其设置器中设置属性 |
| 类别 | 可靠性 |
| 修复是导致破坏性更改还是非破坏性更改 | 非中断 |
| 在 .NET 10 中默认启用 | 作为一种建议 |
| 适用的语言 | C# 和 Visual Basic |
原因
属性在其自身的 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
有关详细信息,请参阅如何禁止显示代码分析警告。