2011-05-14 27 views
6

我犯了这个错误的次数 - 当我快速工作,并使用代码完成它发生。我最终得到如下代码:为什么没有关于身份分配的警告?

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

然后,测试失败的方式稍微不明显,我感到失望。

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

+0

我同意这种行为是很疯狂的。我觉得,至少,代码完成应该更聪明。 – Domenic 2011-05-14 23:29:59

+0

在一个侧面说明,我通常尽量避免在那里我结束了与它的类型相同的名称属性的情况。例如'public PropertyNames Names {get;组; }' – 2011-05-14 23:36:00

+1

您可能想要阅读http://blogs.msdn.com/b/ericlippert/archive/2011/03/03/danger-will-robinson.aspx – 2011-05-15 00:02:14

回答

2

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

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

+0

不错的主意,谢谢 – 2011-05-14 23:32:44

+0

我对这个答案的投票规则有点松散,因为它对我来说是最有用的答案,即使采取从字面上它回答我的问题,不是我的问题:)希望这就好了。 – 2011-05-16 16:43:01

3

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

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

+0

偏离主题......这种类型的财产分配并不能保证在一般情况下是一个nop:吸气人员可以触发各种副作用行为,并且班级作者可以使用'P = P'作为一个从构造函数中触发这些动作的(疯狂的,迂回的,容易出错的)方式赋值。 – LukeH 2011-05-14 23:46:19

+0

@LukeH:不是题外话题,其实这就是问题所在。 – 2011-05-15 00:04:34

+0

@LukeH,当然是你的权利 - 我只能说它让我想起了一些我认为在我的c/C++时代引发了一些警告的事情,而且它的一般警告类是“如果写起来容易由于错误和99%的时间它真的是一个错误,然后生成一个警告“..我能想到的最简单的事情是,如果你把一个赋值在表达式中,single =而不是== ...该语言允许它但开发者很少打算这么做。 – 2011-05-16 16:40:26

5

我,如果有写这样的代码的正当理由,永远

取决于你如何看待只是好奇,可惜是的,有。因为我们正在谈论的标识符是一个属性,分配属性的属性听起来像无操作,但它实际上调用方法,getter和二传手,而这些方法可能有副作用。

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

编辑:

通过对比,如果该标识符是字段,而不是一个属性,它生成这样的警告:

警告CS1717:输入分配到相同的变量制成;你的意思是分配别的东西吗?

相关问题