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


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

还有一些通过财产访问流的例子,即 HttpResponse.OutputStream

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


17
2018-01-12 16:56


起源




答案:


的FxCop 规则: CA1024:在适当的地方使用属性


9
2018-01-12 17:03



这表明拥有返回数组的属性是不好的。任何人都可以详细说明 为什么 那很糟? - Mike Ruhlin
因为任何可以获取引用的人都可以将数组的内容更改为任何任意值: blogs.msdn.com/b/ericlippert/archive/2008/09/22/... - thecoop
如果从属性返回一个数组,则实际上是返回指向该数组的指针。这意味着即使您没有提供setter方法,您也突然发现它以便其他代码可以修改您的数组。因此,您可以在不知情的情况下更改数组的内容。 - GendoIkari
那 FxCop 规则非常好,但我认为错过了。您需要访问数据的次数。我们知道网络流不能回头,我认为这就是为什么只有一次获得流是有意义的。我更喜欢在后续调用中抛出异常 GetSomeNetworkStream()。 - Xaqron


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

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

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

通常,您应该在以下情况下使用getter方法:

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

在一个句子中,如果从概念上讲所需的值是对象HAS,则使用属性。如果所需的值是对象DOES的结果,请使用方法。


8
2018-01-12 17:06





好问题。 这个 文章提出了一些好处。通常,我在计算昂贵时使用方法,而在计算不昂贵时使用属性(即返回存储值)。


3
2018-01-12 17:06





我相信,我的意见是,它将快速达到-10,是你应该只使用属性进行序列化。在所有其他情况下,显式方法调用更可取,因为当您查看它时,您知道正在调用具有可能副作用的方法。

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


1
2018-01-12 17:02



物业吸气者应该 永远不能 有副作用,如果你有副作用,我同意使用一种方法。 - BrokenGlass
有点简单。属性不是那么单一用途;它们允许您进行需要工作的操作看起来像简单的赋值/检索,避免一些数据和字段的方法的混乱(并减少重构现在需要内部工作处理的字段的用法的复杂性)。 - KeithS