为什么没有关于身份分配的警告?

时间:2011-05-14 23:19:35

标签: c# compiler-warnings

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

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

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

我只是好奇是否有合理的理由来编写这样的代码,如果没有,那么它是否会让一个好的候选人产生警告?

3 个答案:

答案 0 :(得分:6)

  

我只是好奇是否有合理的理由来编写这样的代码,

根据你的看法,不幸的是有的。因为我们所讨论的标识符是属性,所以将属性分配给属性声音就像无操作,但它实际上调用方法,getter和setter,这些方法可能有副作用。

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

修改

通过比较,如果标识符是字段而不是属性,则会生成此警告:

  

警告CS1717:对同一变量进行分配;你的意思是分配其他东西吗?

答案 1 :(得分:3)

除了“它被视为有效指令”之外,没有理由使用它。也就是说,它也没有错:它符合赋值的语法。

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

答案 2 :(得分:3)

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

警告3 CA1801:Microsoft.Usage:从不使用'Model.Model(string)'的参数'propertyNames'。删除参数或在方法体中使用它。