虽然我对汽车行业当然很熟悉,但我只是在工作中偶然发现,这似乎是一只截然不同的野兽:
public SomeType SomeProp
{
get
{
return someField;
}
set
{
}
}
我很惊讶它甚至编译了,我想它一定是个bug:这个属性似乎允许设置,但是这样做绝对不会做任何事情。
这个构造有什么用吗?是不是就像电梯里那些“关门”的按钮,什么都不做,但却让用户感觉很好?
发布于 2012-01-16 17:39:21
当结果需要在web服务中序列化或使用XML或二进制序列化程序时,您经常会看到这一点。
这是懒惰和草率,但它经常发生。这给对象留下了属性可设置的“外观”。如果这样做是为了实现一个接口并允许编译,那么开发人员需要在头部和肩膀上使用一个钝的对象,因为他刚刚打破了接口。如果有一个有效的理由不能实现它,那么开发人员需要把它踢回架构师那里进行审查。在实现接口时,不只是留下空的存根方法。如果目前还没有为实现定义的技术,那么至少抛出一个新的NotImplementedException,这样单元测试就会捕获它。
至于序列化: ReadOnly属性不包含在常规序列化中,这会使web服务客户端无法使用该属性。(参考文献:不能公开只读属性.)这是我们都应该迁移到WCF和DataContracts的原因之一。如果通过WCF接受此类作为方法的输入类型,则再次检索钝器对象。
发布于 2012-01-16 17:28:55
你为什么不希望它不编译?实际上,setter只是一个具有单个参数的void方法。您可以非常轻松地编写破损的方法,而不必期望编译器注意到--属性也是如此。
但是,我很难想象,除了“部分”实现之外,任何情况都是故意的--例如,演示语言特性,或者测试一些确实设置了属性的东西,但您不在乎测试将其设置为什么。(我个人至少还是会记录一下,财产已经设定好了。)
发布于 2012-01-16 17:28:08
这本身似乎并不有用,但是考虑一个需要类具有SomeProp
的接口,您需要在类中实现这个接口,但是SomeProp
只具有可读性和不可写性。
public interface IQuestion
{
public int AnwserToLife { get; set; } //leave out 'set' for read-only
}
public class HitchHiker : IQuestion
{
public int AnwserToLife
{
get
{
return 42;
}
set
{
//never changes
}
}
}
https://stackoverflow.com/questions/8883797
复制相似问题