何时使用 GetXXX() 方法以及何时使用 Getter 属性

Posted

技术标签:

【中文标题】何时使用 GetXXX() 方法以及何时使用 Getter 属性【英文标题】:When to use GetXXX() method and when a Getter property 【发布时间】:2011-06-07 23:28:02 【问题描述】:

有一些 .NET 库使用方法而不是 getter 来访问对象数据,例如 HttpWebResponse.GetResponseStream()

还有一些通过属性访问流的例子,例如HttpResponse.OutputStream

我的问题是何时使用哪种形式的访问以及为什么?

【问题讨论】:

【参考方案1】:

请参阅FxCop 规则:CA1024: Use properties where appropriate。

【讨论】:

这表明拥有返回数组的属性是不好的。谁能详细说明为什么这很糟糕? 因为任何人都可以将数组的内容更改为任意值:blogs.msdn.com/b/ericlippert/archive/2008/09/22/… 如果你从一个属性返回一个数组,你实际上是在返回一个指向该数组的指针。这意味着您突然做到了,即使您不提供 setter 方法,其他代码也可以修改您的数组。因此,您的数组的内容可能会在您不知情的情况下被更改。 FxCop 的规则非常好,但我认为错过了一个。您需要访问数据的次数。正如我们所知,网络流无法回溯,我认为这就是为什么只获取一次流是有意义的。我更喜欢在后续调用 GetSomeNetworkStream() 时抛出异常。【参考方案2】:

好问题。虽然属性只是一对 get/set 方法的语法糖,但应该在不同的时间使用两个。

通常,您应该在以下情况下使用属性样式的 getter:

要返回的值表示类字段数据(通常是基元/值类型,但对另一个域对象的引用也可以) 产生该值的计算(如果有)相对便宜/无副作用 如果输入相同,两次获取相同的值将产生相同的值

一般情况下,您应该在以下情况下使用 getter 方法:

返回的对象是为此目的创建的(例如工厂方法) 评估返回值需要副作用(例如,触摸文件系统、数据库或更改其他值) 两次获取返回类型将产生两个不同的结果(即两个流、数据库连接等)。

在一个句子中,如果从概念上讲,所需的值是对象具有的东西,请使用属性。如果需要的值是对象所做的某事的结果,请使用方法。

【讨论】:

【参考方案3】:

好问题。 This 文章提出了一些优点。一般来说,我在计算量大时使用方法,而在计算量不高时使用属性(即返回存储值)。

【讨论】:

【参考方案4】:

我的观点是,我敢肯定,它会很快达到 -10,即您应该只使用属性进行序列化。在所有其他情况下,显式方法调用更可取,因为当您查看它时,您知道正在调用具有可能副作用的方法。

我猜“正确”(tm) 的答案是,当您的所有方法都会返回值时,可以使用 getter/setter,但如果有任何工作要做,请使用方法。

【讨论】:

Property Getter 不应该永远有副作用,如果你有副作用我同意改用一种方法。 有点简单。属性不是那么单一用途;它们允许您使需要工作的操作看起来像简单的分配/检索,避免一些数据和其他字段的方法陷入困境(并降低现在需要内部工作处理的字段的重构使用的复杂性)。跨度>

以上是关于何时使用 GetXXX() 方法以及何时使用 Getter 属性的主要内容,如果未能解决你的问题,请参考以下文章

实际示例何时使用抽象类以及何时使用 Java 8 引入的接口(默认和静态方法)[重复]

Objective C:何时在 App Delegate 中使用方法以及何时在 View Controller 中使用方法

何时使用 viewDidLoad 以及何时使用 awakeFromNib

使用服务器端渲染获取数据的正确方法(Next.js,何时使用 componentDidMount 以及何时使用 componentWillMount)

使用 Java servlet 时何时打开以及何时关闭 mysql 连接?

如何以及何时使用 Ember.Application 注册和注入方法?