CA2245:请勿将属性分配给其自身
属性 | 值 |
---|---|
规则 ID | CA2245 |
标题 | 请勿将属性分配给其自身 |
类别 | 使用情况 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 8 中默认启用 | 作为建议 |
原因
属性意外赋值给了其自身。
规则说明
将字段符号、本地符号或参数符号赋值给其自身时,C# 编译器将生成警告 CS1717:对同一变量进行赋值;是否希望对其他变量赋值?。 如果本地符号、参数符号或字段符号的名称类似于作用域中的另一个符号,这种错误很常见。 不要在赋值的左右两侧使用不同的符号,而是在两侧使用相同的符号。 这会导致对值自身进行冗余赋值,通常指示功能性 bug。
对于几乎所有真实情况,将属性赋值给自身也是一个类似的功能性 bug。 但是,在某些极端情况下,提取属性值可能会产生副作用,并且该属性的新值与原始值不同。 如果是这样,则将属性赋值给自身不是冗余的,并且不能删除。 这会阻止编译器针对将属性赋值给自身生成 CS1717
警告,并且不会因这些情况产生中断性变更。
规则 CA2245
旨在弥补这一缺陷。 它报告了将属性赋值给自身的冲突,以帮助解决这些功能性 bug。 对于需要将属性赋值给自身的一小部分极端情况,可以在具有适当理由注释的源中禁止显示 CA2245
冲突警告。
如何解决冲突
若要解决冲突,请在赋值的左右两侧使用不同的符号。 例如,以下代码片段显示了规则冲突及其解决方法:
public class C
{
private int p = 0;
public int P { get; private set; }
public void M(int p)
{
// CS1717: Accidentally assigned the parameter 'p' to itself.
p = p;
// CA2245: Accidentally assigned the property 'P' to itself.
P = P;
}
}
public class C
{
private int p = 0;
public int P { get; private set; }
public void M(int p)
{
// No violation, now the parameter is assigned to the field.
this.p = p;
// No violation, now the parameter is assigned to the property.
P = p;
}
}
何时禁止显示警告
如果提取属性值可能会产生副作用并且该属性的新值与原始值不同,则可禁止显示此规则的冲突警告。 如果是这样,则将属性赋值给自身不是冗余的。 应针对可禁止显示警告添加理由注释,以将此行为记录为预期行为。
抑制警告
如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。
#pragma warning disable CA2245
// The code that's violating the rule is on this line.
#pragma warning restore CA2245
若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none
。
[*.{cs,vb}]
dotnet_diagnostic.CA2245.severity = none
有关详细信息,请参阅如何禁止显示代码分析警告。