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

18

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

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

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

4个回答

9

这说明具有返回数组的属性不好。有人能详细解释一下为什么吗? - Mike Ruhlin
1
由于数组的内容可以被任何能够获取到其引用的人更改为任意值,因此数组有些危险:http://blogs.msdn.com/b/ericlippert/archive/2008/09/22/arrays-considered-somewhat-harmful.aspx - thecoop
如果你从一个属性中返回一个数组,实际上你返回的是指向该数组的指针。这意味着你突然让其他代码可以修改你的数组,即使你没有提供setter方法。因此,你的数组内容可能会在你不知道的情况下被改变。 - GendoIkari
那些 FxCop 规则非常不错,但我认为缺少了其中一条。我们知道网络流无法回溯,因此只获取一次流是有意义的。 我更喜欢在后续调用 GetSomeNetworkStream() 时抛出异常。 - Xaqron

8
很好的问题。虽然属性只是一对get/set方法的语法糖,但两者应在不同的时间使用。
通常,在以下情况下应使用属性样式的getter:
- 要返回的值表示类似于字段的数据(通常为基元/值类型,但引用另一个域对象也可以) - 产生该值的计算(如果有)相对便宜/无副作用 - 给定相同的输入,两次获取相同的值将生成相同的值
通常,在以下情况下应使用getter方法:
- 返回的对象是为此目的创建的(例如工厂方法) - 评估返回的值需要副作用(例如触摸文件系统、数据库或更改其他值) - 获取返回类型两次将产生两个不同的结果(即两个流、数据库连接等)。
简而言之,如果概念上需要的值是对象拥有的东西,请使用属性。如果需要的值是对象执行某些操作的结果,请使用方法。

3
很好的问题。这篇文章提出了一些不错的观点。通常情况下,当计算较为昂贵时,我会使用方法;而当计算不昂贵时(即返回一个存储的值),我会使用属性。

1

我的观点可能会很快降到-10,但我认为你应该只在序列化时使用属性。在其他情况下,显式调用方法更可取,因为当你看到它时,你知道正在调用可能具有副作用的方法。

我想“正确”的答案是,如果你的方法只是返回值,那么使用getter/setter是可以的,但如果有任何工作要做,就使用方法。


3
属性获取器绝对不能有任何副作用,如果有副作用,我建议使用方法来代替。 - BrokenGlass
有点简单化。属性并不是那么单一的;它们允许您执行需要工作的操作,看起来像简单的赋值/检索,避免了对某些数据使用方法和对其他数据使用字段的混乱(并减少了重构处理现在需要内部工作的字段用法的复杂性)。 - KeithS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接