繁体   English   中英

具有空访问者的属性

[英]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方法,那么有两个选项:

  1. 设置器是冗余的,属性应该是只读的,或者
  2. 您的代码中存在一部分将设置此值并错误地假设它有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM