[英]Properties with empty accessors
虽然我当然熟悉自动属性,但我在工作中遇到过这个问题,这似乎是一个截然不同的野兽:
public SomeType SomeProp
{
get
{
return someField;
}
set
{
}
}
我很惊讶它甚至编译,我想它一定是一个bug:该属性似乎允许设置,但这样做绝对没有。
这个结构有用吗? 电梯中的那些“关门”按钮是不是做了什么,但让用户感觉良好?
为什么你不期望它不编译? 有效地,setter只是一个带有单个参数的void方法。 您可以非常轻松地编写损坏的方法,而无需编译器注意 - 属性也是如此。
我不能很容易想象这个地方会是故意的,但是其他比“偏”实现任何情况下-例如演示语言特性,或者如果你要测试的东西, 并设置属性,但你不关心什么测试设置为。 (我个人通常至少会记录该物业已被设定。)
当结果需要在Web服务中序列化或使用XML或二进制序列化程序时,您经常会看到这种情况。
这是懒惰和草率,但它经常发生。 这使对象具有属性可设置的“外观”。 如果它是为了实现一个接口并允许编译,那么做它的开发人员需要被一个钝器对头部和肩膀大肆殴打,因为他刚刚打破了界面。 如果存在无法实现的正当理由,则开发人员需要将其重新提交给架构师进行审核。 实现接口时,不要只留下空的存根方法。 如果您目前没有为实现定义的技术,那么至少抛出一个新的NotImplementedException,以便单元测试能够捕获它。
就序列化而言:ReadOnly属性不会包含在常规序列化中,并且可能使该属性对Web服务客户端不可用。 (参考: XML Web服务不能公开只读属性 。)这是我们应该转向WCF和DataContracts的原因之一。 如果您通过WCF接受此类作为方法的输入类型,则再次检索钝对象。
这本身似乎并不有用,但考虑一个需要类具有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
}
}
}
有一些用例,这将是一个必要的解决方法,其中一些我已经“在野外”遇到过。
例如:该属性是旧时的遗骸,不再使用,但应用程序的其他部分从未更新过(源丢失?第三方?)并坚持设置该属性。 我已经看到,在旧代码中,需要插件在更新某些数据集后设置isDirty属性,当实现更改为观察自身的数据集时,isDirty属性变得无用,但无法放弃,因为其他代码仍然想要设置它。
我建议避免这种编程。 它编译,因为它没有理由不应该,但如果接口要求你实现一个setter方法,那么有两个选项:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.