【问题标题】:Performance of Property Get v Method属性 Get v 方法的性能
【发布时间】:2012-09-04 15:24:48
【问题描述】:

我有一个包含方法集合的类,我想知道使用方法而不是属性是否有任何性能优势?

其中一些方法相当复杂,但基本上返回一个 IEnumerable 对象集合,而另一些则是一个简单的return values.Where(x => x.property == "comparison") Linq 查询。

示例

方法:

public IEnumerable<PenDataRow> ActivePens() => Pens.Where(x => x.Status == "Active");

属性:

public IEnumerable<PenDataRow> ActivePens => Pens.Where(x => x.Status == "Active");

将它们标记为属性或方法会更好吗?

【问题讨论】:

    标签: c# oop


    【解决方案1】:

    属性在底层实现为方法,因此绝对没有性能差异。 guidelines for choosing between a property and a method 是语义化的。

    【讨论】:

      【解决方案2】:

      本身没有性能差异,但我认为您的班级的用户可能“期望”有一个。也就是说,像ActivePens 这样的属性可能被认为比像GetActivePens() 这样的方法“更轻”。我尝试编写方法来获取更昂贵的事物的值。这是非常主观的。

      也可能存在调试器影响 - 将鼠标悬停在调试器中的类中的属性上可能会调用该属性并导致昂贵的操作来显示工具提示。

      【讨论】:

      • 关于调试器的影响,这绝对是真的。当您将鼠标悬停在属性上时,调试器将尝试评估属性,默认情况下它不会尝试调用方法。这可能有起有落(很难检查它是否是一种方法,但也不会导致意外的副作用。)我遇到的最糟糕的问题是由单例实例引起的,其中实例化单例会导致副作用。如果您在实例化期间遇到断点并将鼠标悬停在 Instance 属性上,则可能会触发尝试重新实例化,从而导致非常奇怪的结果。
      • 也就是说,默认情况下它不会枚举,因此这种特定情况不会在调试器中造成任何意外开销。
      【解决方案3】:

      属性只是具有特定命名和元数据的一两个方法。

      因此开销是相同的,JIT 内联的机会也是一样的。

      【讨论】:

        【解决方案4】:

        不,没有任何性能提升,因为它们也是有助于以更优雅的方式公开您的私有字段的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-31
          • 2019-12-25
          • 1970-01-01
          • 2013-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多