在 C# 中。如果不使用 属性,是否仍会计算它的值?

In C#. If a property isn't used, is it's value still calculated?

想象一下class

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



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

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

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

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

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

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

Inling 性能高,但通常这不会影响它的任何工作。