为什么没有关于标识分配的警告

本文关键字:标识 分配 警告 于标识 为什么 | 更新日期: 2023-09-27 17:56:22

我已经犯过很多次这个错误 - 当我快速工作并使用代码完成时,就会发生这种情况。 我最终得到如下代码:

public class Model : IModel
{
    public PropertyNames PropertyNames { get; set; }
    public Model(PropertyNames propertyNames)
    {
        PropertyNames = PropertyNames;
    }
}

然后测试以稍微不那么明显的方式失败,我感到沮丧。

我只是好奇是否有正当的理由编写这样的代码,如果没有,那么它是否适合生成警告?

为什么没有关于标识分配的警告

我只是好奇是否有正当的理由编写这样的代码,永远

根据你的看法,不幸的是是的。 因为我们谈论的标识符是一个属性,所以将属性分配给属性听起来像是无操作,但它实际上调用了方法、getter 和 setter,这些方法可能会产生副作用。

一个非常常见的特定情况是,如果二传手执行诸如属性通知之类的操作或调用观察者,但是当您调用getter或二传手时,可能会发生任何事情。 这就是代码不生成警告的原因:因为这种编码风格实际上很有用,并且在生产代码中使用。

编辑:

相比之下,如果标识符是字段而不是属性,则会生成以下警告:

警告 CS1717:对同一变量进行了赋值;您是要赋值其他变量吗?

使用 FxCop(又名代码分析),它会给你警告:

警告 3 CA1801:Microsoft.用法:从不使用"模型.模型(字符串)"的参数"属性名称"。删除参数或在方法主体中使用它。

除了"它算作有效指令"之外,没有理由使用它。也就是说,它也没有错:它符合赋值的语法。

如果你正在编写一个代码验证器,那么这是一个很好的警告候选者,尽管它当然不应该妨碍实际编译;大多数编译器已经在字节码优化期间捕获了这种操作,其中不执行任何控制逻辑并且实际上不修改寄存器的指令被删除。