【问题标题】:In C#. If a property isn't used, is it's value still calculated?在 C# 中。如果一个属性没有被使用,它的价值是否仍然被计算?
【发布时间】:2019-12-02 18:17:16
【问题描述】:

想象这个类

Class Person
{
  public string Name { get; set; }
  public int SomeExpensiveCalculation {
    get {
      return TimeConsumingCalulation(Name )
    }
  }
}



由于 get 是一种方法,我假设,当从未请求或使用属性“SomeExpensiveCalculation”时,永远不会执行函数“TimeConsumingCalulation”。这是正确的吗?

【问题讨论】:

  • “正确吗?” 是的。但我想说这是不好的做法,属性不应该是长时间运行的计算(甚至可能引发异常)。比从未调用它更糟糕的是,TimeConsumingCalculation() 将在您访问该属性时每次被调用..
  • 直接调用该方法,而不是将其隐藏在属性中。该属性所做的只是使您不必在调用结束时加上括号。
  • 看看thisget 是一种方法。一个方法在你调用它之前不会被执行。然而,正如 Rene 所说,使用属性与方法会向调用者传达他们只是在检索一个值,而不是调用一些长时间运行的方法。如果它是一个属性,那么某人可能会一次又一次地引用它,而没有意识到他们正在调用一个长时间运行的方法。如果它是一种方法,他们会将结果存储在一个变量中。另一种判断方式 - 设置断点。
  • 当您在该对象上调试和添加手表时会很有趣
  • 看看 Lazy 泛型类。它允许您只评估一次昂贵的函数,并且仅在请求该值时。

标签: c# object properties instantiation


【解决方案1】:

没错。属性 getter 只是一个在调用时执行的方法。

但属性应该简单,避免在属性get内部进行昂贵的计算。

【讨论】:

    【解决方案2】:

    没错。属性只是 GetValue 和 SetValue 函数对的语法糖。我认为他们还增加了一些反射支持。

    对于可能不需要的值进行耗时操作,Lazy[T] 可能是一个好工具? Lazy Initialsiation 是您的意图至少可能更清楚。在它和 WeakRefrence[T] 之间,您通常可以使用内存分配或时间消耗来覆盖边缘情况。

    然而,在运行时实际执行的代码有点棘手。 .NET 具有称为“及时”编译器的此功能,它可能会或可能不会进行各种优化。它可以添加一个临时变量以避免两次检索相同的集合值。或削减未使用的临时变量。删除数组访问器中的大部分边界检查。

    Inling 属性就在那里,但通常这不会影响它的任何工作。

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 2019-03-09
      • 2019-05-27
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多