【问题标题】:Constructor or properties: which one is the better choice while assigning values构造函数或属性:赋值时哪个是更好的选择
【发布时间】:2011-05-09 14:38:35
【问题描述】:

在赋值时我们应该使用构造函数而不是属性,反之亦然。

【问题讨论】:

  • 我想你的意思是分配 initial 值...
  • @drachenstern - 感谢您的链接
  • @user498432 ~ 如果这是您需要的,请告诉我,我会将其作为答案放入,以便您可以为其他提出相同问题的人接受它。

标签: c# properties constructor


【解决方案1】:

构造函数是一种非常方便且强大的契约类型 - 一种要求消费者在使用您的对象之前提供某些信息的方式。因此,对于实例正常运行所需的信息,请使用构造函数参数。这是依赖注入的基本概念 - 您在完成工作时所依赖的任何东西,都必须在开始之前注入(提供)给您。

属性可以代表一个有趣的问题。一般来说,经验告诉我,只要有可能,属性应该是只读的,对象通常应该尽可能在外部不可变。向属性添加公共 setter 会增加类的复杂性。当然,总有一些类型的对象——实体就是一个很好的例子——setter 是有意义的。但是对于大多数对象来说,状态的“通过构造函数写入”/“通过属性读取”的模式大大降低了我负责的应用程序的复杂性和错误风险。

【讨论】:

    【解决方案2】:

    如果要构造对象确实需要参数值(没有它们,对象将无法开始存在),请使用构造函数。对具有可接受的默认值的参数使用属性,因此根本不分配它们是可以的。您可以提供一些额外的构造函数,这些构造函数会将一些属性作为速记分配给您的用户。

    【讨论】:

      【解决方案3】:

      当您需要任意合理的初始值时,您可以使用构造函数,而当您希望这些值以后可以更改时,您可以使用属性。

      【讨论】:

      • 我一直更喜欢属性,可以吗
      • 如果你的对象不需要任意的初始值,也就是说它在构造方法本身中具有合理的值,当然。
      【解决方案4】:

      在某些情况下,可变属性可能更可取:

      1. 对于仅设置属性没有副作用的“纯”可变数据对象。例如,您可能有一个表示数据库中某个实体的对象,但在您明确执行提交操作之前,修改其属性不会有任何影响。对象是一个包含数据的包,但没有任何东西直接对数据的变化做出反应。

      2. 如果您有大量会影响某些操作的可配置状态,并且许多可配置属性具有有意义的默认值。如果这些是执行操作的类的属性,通常会有一些“冻结”状态的概念,以便可变属性在操作运行时抛出异常。

      3. 如果您正在开发一个将由视觉设计器或其他依赖于属性反射的系统使用的类。例如,WPF 中的数据绑定系统广泛使用可变属性作为​​交流 UI 交互的方式。通过适当的设计来管理这些突变,您可以创建一些非常强大且响应迅速的界面。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 2019-02-02
        • 2011-01-26
        相关资源
        最近更新 更多