在C#中。如果不使用某个属性,是否仍在计算其值?

时间:2019-07-24 14:40:34

标签: c# object properties instantiation

想象一下这堂课

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



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

2 个答案:

答案 0 :(得分:2)

是的。属性获取器只是一种在调用时执行的方法。

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

答案 1 :(得分:0)

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

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

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

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