【问题标题】:When to use properties instead of functions何时使用属性而不是函数
【发布时间】:2010-11-25 08:20:00
【问题描述】:

这可能是个人喜好问题,但你什么时候在代码中使用属性而不是函数

例如,我可以说得到一个错误日志

string GetErrorLog()
{
      return m_ErrorLog;
}

或者我可以

string ErrorLog
{
     get { return m_ErrorLog; }
}

您如何决定使用哪一个?我的用法似乎不一致,我正在寻找一个好的一般经验法则。谢谢。

【问题讨论】:

标签: c# properties coding-style


【解决方案1】:

如果满足以下条件,我倾向于使用属性:

  • 该属性将返回单个逻辑值
  • 几乎不涉及或不涉及逻辑(通常只返回一个值,或者做一个小的检查/返回值)

如果满足以下条件,我倾向于使用方法:

  • 返回值将涉及大量工作 - 即:它将从数据库中获取,或者可能需要“时间”的东西
  • 在获取或设置值时涉及相当多的逻辑

此外,我建议您查看Microsoft's Design Guidelines for Property Usage。他们建议:

当成员是逻辑数据成员时使用属性。

在以下情况下使用方法:

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

【讨论】:

  • 我要补充一点,你的方法应该只有一个责任。不要创建大量的方法来做不同的事情。将每个不同的工作拆分为私有方法,甚至拆分为另一个类中的方法
  • @AnthonyWJones:当它发生时总是一个惊喜:)
  • @skyfoot:是的,但通常,您需要一个方法调用多个方法以指定特定的执行顺序。我同意 - 它们应该被重构为小部分,但为了在属性和方法之间进行选择,在方法中发生的 TOTAL 执行(即使它调用另一个,它调用另一个等)很重要。
  • 我会在上面的列表中添加成员应该是一个属性,如果它需要暴露给数据绑定。
【解决方案2】:

以下是 Microsoft 的指南:

Choosing Between Properties and Methods

  • 如果成员表示该类型的逻辑属性,请考虑使用属性。

  • 如果属性的值存储在进程内存中并且该属性仅提供对该值的访问,请使用属性而不是方法。

  • 在以下情况下,请使用方法而不是属性。

    • 该操作比字段集慢几个数量级。如果您甚至考虑提供操作的异步版本以避免阻塞线程,那么该操作很可能过于昂贵而不能成为属性。特别是,访问网络或文件系统的操作(除了一次初始化之外)应该很可能是方法,而不是属性。

    • 操作是一种转换,比如Object.ToString方法。

    • 该操作每次调用都会返回不同的结果,即使参数没有改变。例如,NewGuid 方法每次调用都会返回不同的值。

    • 该操作具有显着且可观察到的副作用。请注意,填充内部缓存通常不会被视为可观察到的副作用。

    • 该操作返回内部状态的副本(这不包括堆栈上返回的值类型对象的副本)。

    • 操作返回一个数组。

【讨论】:

    【解决方案3】:

    如果我可以影响多个领域,我永远不会使用属性 - 我总是使用方法。

    一般来说,我只使用 公共字符串错误日志 { 获取;私人套装; } 属性的语法和其他一切的使用方法。

    【讨论】:

      【解决方案4】:

      除了 Reed 的回答之外,当属性只是一个 getter 时,就像获取诸如事件日志之类的资源一样。我尝试仅在属性没有副作用时才使用属性。

      【讨论】:

        【解决方案5】:

        如果属性中发生的不仅仅是一些琐碎的事情,那么它应该是一个方法。例如,如果您的 ErrorLog getter 属性实际上是在读取文件,那么它应该是一个方法。访问一个属性应该很快,如果它做了很多处理,它应该是一个方法。如果访问类的用户可能不期望的属性有副作用,那么它可能应该是一个方法。

        .NET Framework Design Guidelines 的书非常详细地介绍了这类东西。

        【讨论】:

          【解决方案6】:

          当语义明确是“从对象中获取某个值”时,我会使用属性。然而,使用方法是一种很好的沟通方式,“这可能需要付出更多的努力才能返回”。

          例如,一个集合可以有一个Count 属性。可以合理地假设集合对象知道当前持有多少项目,而无需实际遍历它们并计算它们。

          另一方面,这个假设的集合可能有 GetSum() 方法,该方法返回所持有的项目集的总数。该集合只是一个简单的 Sum 属性,但通过使用一种方法,它传达了这样一个想法,即集合必须做一些实际的工作才能得到答案。

          【讨论】:

            猜你喜欢
            • 2010-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-25
            • 1970-01-01
            • 2010-09-09
            • 1970-01-01
            相关资源
            最近更新 更多