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

有关详细信息,请参阅如何禁止显示代码分析警告

另请参阅