当我们应该在赋值时使用构造函数而不是属性,反之亦然。
答案 0 :(得分:31)
构造函数是一种非常方便且功能强大的契约类型 - 一种要求消费者在甚至可以使用您的对象之前提供某些信息的方法。因此,对于实例正常运行所必需的信息,请使用构造函数参数。这是依赖注入的基本概念 - 您在工作之前所依赖的任何事情都必须在开始之前注入(提供)给您。
属性可以代表一个有趣的问题。一般来说,经验告诉我,只要有可能,属性应该是只读的,对象通常应该尽可能外部不变。向属性添加公共setter是您的类的复杂性的乘数。当然,总有一些对象类型 - 实体就是一个很好的例子 - 其中setter是有意义的。但是对于大多数对象来说,状态的“通过构造函数写入”/“通过属性读取”的模式极大地降低了我负责的应用程序的复杂性和错误风险。
答案 1 :(得分:2)
如果构造对象确实需要参数值,则使用构造函数(没有它们,对象无法启动)。对具有可接受的默认值的参数使用属性,因此可以根本不分配它们。您可以提供一些额外的构造函数,这些构造函数会将一些属性作为速记分配给您的用户。
答案 2 :(得分:1)
在某些情况下,可变性质可能更可取:
对于'纯'可变数据对象,仅设置属性不会产生副作用。例如,您可能有一个对象代表数据库中的某个实体,但在您显式执行Commit操作之前,修改其属性不会产生任何影响。该对象是一个用于包含数据的包,但没有任何内容直接对数据中的更改做出反应。
如果您有大量可配置状态会影响某些操作,并且许多可配置属性具有有意义的默认值。如果这些是执行操作的类的属性,那么通常会有一些“冻结”状态的概念,以便可变属性在操作运行时抛出异常。
如果您正在开发一个将由视觉设计师或依赖于反射属性的其他系统使用的类。例如,WPF中的数据绑定系统广泛使用可变属性作为传递UI交互的方式。通过适当的设计来管理这些突变,您可以创建一些非常强大且响应迅速的界面。
答案 3 :(得分:0)
当您需要任意理智的初始值时,您可以使用构造函数;如果希望稍后可以更改值,则使用属性。