在您可以访问这两种结构的情况/语言中,一般划分如下:
- 如果请求是针对对象拥有的东西,请使用属性(或字段)。
- 如果请求是针对对象所做的某事的结果,请使用方法。
更具体地说,属性将用于以读取和/或写入方式访问由暴露该属性的对象拥有的数据成员(用于消费目的)。属性优于字段,因为数据不必一直以持久形式存在(它们允许您“懒惰”地计算或检索此数据值),并且它们优于用于此目的的方法,因为您仍然可以在代码中使用它们,就好像它们是公共字段一样。
但是,属性不应导致副作用(可能的,可以理解的例外是设置一个旨在保持返回值的变量,避免需要多次重新计算昂贵的值);在所有其他条件相同的情况下,它们应该返回确定性结果(因此 NextRandomNumber 对于属性来说是一个糟糕的概念选择),并且计算不应导致任何会影响其他计算的状态数据的更改(例如,获取 PropertyA 和按该顺序的 PropertyB 不应返回与获取 PropertyB 和 PropertyA 不同的结果)。
方法OTOH在概念上被理解为执行一些操作并返回结果;简而言之,它做了一些事情,可能超出了计算返回值的范围。因此,当返回值的操作具有额外的副作用时,将使用方法。返回值可能仍然是某些计算的结果,但该方法可能已对其进行了非确定性计算(GetNextRandomNumber()),或者返回的数据是对象的唯一实例的形式,再次调用该方法会产生一个不同的实例,即使它可能具有相同的数据 (GetCurrentStatus()),或者该方法可能会更改状态数据,从而连续两次执行完全相同的操作会产生不同的结果 (EncryptDataBlock();