以下是一些有关属性的参数和我的反参数:
比编写getter和setter方法更容易使用
Getter和setter方法对是代码的味道。编写起来更容易,就像使用Scantron表格并填写所有“ C”来简化数学测试失败一样。对于持久性,仅包含状态的对象不应使用getter / setter,而在持久性时应创建不可变的对象。
对于对象的消费者而言,重要的是它的作用,而不是它的作用方式。它的行为就是它所做的;它的状态是如何执行的。如果您发现自己关心对象的状态(持久性除外,尽管这也会破坏OO),那么您根本就没有在做OOP而失去了它的优势。
它们粗略地向消费者表明了性能
对于任何给定的财产,这可能会在将来发生变化。假设在版本1.0中,访问PropertyX只是返回一个字段。在版本1.5中,如果该字段为null,则PropertyX使用Null Object模式创建一个新的null对象。在2.0版中,该字段正在通过PropertyX中的getter方法进行进一步验证。
随着属性变得越来越复杂,使用属性的性能指标似乎越来越不真实。
他们比公共领域更好
这是真的。但是方法也是如此。
它们代表的是与方法根本不同的对象方面,并且对象的所有使用者都应注意这一点
您确定以上两个陈述都是正确的吗?
他们更容易打字,伙计
当然,打字myObject.Length
比打字更容易myObject.Length()
,但是不能用一点句法糖来解决吗?
为什么使用方法而不是属性?
没有性能保证。即使方法变得更复杂,API也会保持真实。如果消费者遇到性能问题,并且他们不依赖API的话,他们将需要分析其代码。
较少供消费者考虑。该酒店有塞特犬吗?一种方法肯定不会。
消费者从正确的OOP思维方式进行思考。作为API的使用者,我有兴趣与对象的行为进行交互。当我在API中看到属性时,它看起来很像状态。实际上,如果属性做得太多,它们甚至都不应该是属性,因此,实际上,API对用户来说是处于状态的属性。
API的程序员将更深入地考虑具有返回值的方法,并尽可能避免在此类方法中修改对象的状态。应当尽可能将命令与查询分开。
所以我问你,为什么要使用属性而不是方法?MSDN上的大多数要点本身就是代码的味道,它们既不属于属性也不属于方法。
(这些想法是在考虑了CQS之后想到的。)
type GetFoo() void SetFoo()
一万遍,那是很有意义的。在编写C#代码的所有时间里,我从未对属性感到困惑。