【问题标题】:When to use a property vs a method? [duplicate]何时使用属性与方法? [复制]
【发布时间】:2010-12-23 16:26:43
【问题描述】:

可能重复:
Properties vs Methods

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

我希望你们在决定两者之间时牢记一些规则。

【问题讨论】:

    标签: c# .net oop


    【解决方案1】:

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

    换一种说法:即使属性不是字段,它们的行为也应该与字段非常相似。这意味着不会造成副作用,不会花费太长时间来执行并且不会抛出异常。

    【讨论】:

    • 不抛出异常?如果设置的值是无效值,你会怎么做?我认为这是在字段上使用属性的原因之一……能够在接受值之前对其进行检查。
    【解决方案2】:

    补充 cletus 所说的内容。

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

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

    【讨论】:

      【解决方案3】:

      我会看一下 this SO 关于属性与方法的帖子。
      它提到看看Choosing Between Properties and Methods

      【讨论】:

        【解决方案4】:

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

        这个最强调了when to use a method

        这项手术足够昂贵,以至于 你想和用户交流 他们应该考虑缓存 结果。

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

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

        【讨论】:

          【解决方案5】:

          这是个好问题。我不知道这方面的任何最佳做法。 在我看来,这通常是一个常识问题。

          属性与它自身的对象/类相关,通常对其进行描述。最好的例子是 UI 元素,Background、Color、IsEnabled 是属性。

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

          【讨论】:

            【解决方案6】:

            在基本层面上,选择属性或方法的决定取决于“有”、“有”的论点。如果您需要的信息是属性或质量,请使用属性。如果是动作,那么方法。

            但在实际层面上,可能很难一直以这种方式实施。

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

            【讨论】:

              【解决方案7】:

              用基本的话来说,属性描述对象,而方法是对象可以做的动作。 对于代表汽车的对象,drive() 是一个方法,color 是一个属性。

              【讨论】:

                猜你喜欢
                • 2016-07-18
                • 1970-01-01
                • 2012-06-21
                • 2014-04-11
                • 2013-05-17
                • 1970-01-01
                • 2017-07-16
                • 2012-08-15
                相关资源
                最近更新 更多