何时使用属性vs方法?

时间:2009-12-06 04:25:18

标签: c# .net oop

  

可能重复:
  Properties vs Methods

关于何时使用属性与方法,是否有任何规则或一般最佳实践?从技术上讲,任何无参数的方法都可以在属性中进行,任何属性都可以作为方法,但有时何时决定何时使用其中一个可能会模糊。

我希望在两者之间做出决定时,我们会记住一些规则。

7 个答案:

答案 0 :(得分:12)

一般标准是关于副作用。如果通过调用成员来获取值,则只获得该值,这是一个属性。如果有副作用,它应该是一种方法。

换句话说:即使属性不是字段,属性应该与字段非常相似。这意味着不会造成副作用,执行时间不会太长,也不会抛出异常。

答案 1 :(得分:5)

补充一下克莱图所说的话。

这是来自msdn:“财产使用指南”http://msdn.microsoft.com/en-us/library/bzwdh01d(VS.71).aspx 请参阅“属性与方法”部分:

  • 该操作是转换,例如Object.ToString。
  • 操作非常昂贵,您希望与用户沟通,他们应该考虑缓存结果。
  • 使用get访问器获取属性值会产生可观察到的副作用。
  • 连续两次致电会员会产生不同的结果。
  • 执行顺序很重要。请注意,应该能够以任何顺序设置和检索类型的属性。
  • 该成员是静态的,但返回一个可以更改的值。
  • 该成员返回一个数组。返回数组的属性可能会产生误导。通常需要返回内部数组的副本,以便用户无法更改内部状态。这与用户可以轻易地认为它是索引属性的事实相结合,导致代码效率低下。在下面的代码示例中,每次对Methods属性的调用都会创建数组的副本。结果,将在以下循环中创建2n + 1个阵列副本。

答案 2 :(得分:2)

我会看看有关属性与方法的this SO帖子 它提到了Choosing Between Properties and Methods

答案 3 :(得分:1)

当某些er ..属性快速执行时使用属性(例如ctrl.Color,ctrl.Text,ctrl.Width,DateTime.Now)。但如果它表示进程,则使用方法(例如str.GetHash(),machine.GetFqdn(),file.GetMd5())。所以在文件md5中,你不会把它变成属性

这最强调when to use a method

  

操作足够昂贵   您想要与用户沟通   他们应该考虑缓存   结果

注意.NET的DateTime.Now,尽管它很快并且属性很好,但是当它在程序中被多次调用时,它需要被缓存,甚至彼此靠近。他们决定把它变成一个属性,属性中有 currentness 的感觉,不像你调用一个方法时,它没有瞬时/当前性的感觉它。所以你需要考虑到即使你得到一个值并需要缓存,但如果它需要感觉即时,一定要使用属性。

毕竟,如果某些东西真的很快并且感觉不是昂贵的操作,它必须有一个可以传达其坚牢度的结构。我认为这就是为什么.NET具有吸引力(或任何具有属性构造的语言)的原因,它不会强迫开发人员使用方法,当你可以使它成为属性时,它不会强迫开发人员使用方法,当你可以做一个围绕重载运算符的高性能代码,这是最好的实用编程

答案 4 :(得分:0)

这是一个很好的问题。我不知道有什么最好的做法。 在我看来,这通常是一个常识问题。

这些属性与它自己的对象/类有关并且通常用它来描述它。 UI元素的最佳示例,背景,颜色,IsEnabled是适当的。

这些方法通常是对象/类可以执行并可以产生结果的操作。这里最好的例子是MessageBox的方法。它会做一个动作并返回一个结果。

答案 5 :(得分:0)

在基础层面,选择财产或方法之间的决定取决于“有”,“确实”的论点。如果您需要的信息是属性或质量,请使用属性。如果这是一个动作,那么方法。

但在实际水平上,一直很难以这种方式实施。

  • 正确地指出,属性应该是轻量级的,方法不需要。
  • 如果信息取决于构造函数中调用的某些初始化代码,那么您应该更喜欢属性。
  • 如果您的信息需要大量操作,请使用方法。
  • 如果它影响文件,屏幕等第三个元素,请使用方法。
  • 您不能拥有不返回任何内容的属性(void)。

答案 6 :(得分:0)

用基本单词表示,属性描述对象,而方法是对象可以执行的操作。 对于代表汽车的对象,drive()将是一种方法,而color将是一种属性。