是否由用户延迟或急切加载定义的属性

时间:2013-07-08 03:56:17

标签: c# properties lazy-loading

当你拥有一个属性时,在C#中:

public class Person
{
  public int AnIntegerValue
  {
    get
    {
      //Some logic
      return somevalue;
    }

  }
}

当你从数据库中找到一个人时:

 var mike = Uow.GetPerson("Mike");

是立即评估的AnIntegerValue,或代码是否等待:

mike.AnIntegerValue

我很想知道,因为如果要在属性中添加大量逻辑并且它是急切加载的话,这显然会影响性能。

3 个答案:

答案 0 :(得分:3)

不会立即评估属性。在访问“get”修饰符时评估它们。

<强>解释

在底线,功能和属性之间没有真正的区别 含义:

public int AnIntegerValue
  {
    get
    {
      //Some logic
      return somevalue;
    }

  }

相当于:

Public int get_AnIntegerValue()
  {

      //Some logic
      return somevalue;  

  }

事实上,这正是你的属性编译成的(你可以看到,如果你在调试时跟踪堆栈)。

因此,与功能未立即评估的方式相同,属性也是如此,您可以使用它们而无需担心额外的性价比。

您可以查看this主题,了解何时使用属性以及何时更好,更优雅的方法。

答案 1 :(得分:1)

这取决于GetPerson()的实施。默认情况下,在实例化类时,不会评估其属性(不会运行getter)。属性的支持变量将初始化为其类型的默认值。

答案 2 :(得分:0)

您应该加载整个对象(或聚合,因为它在域驱动设计中调用)。延迟加载是一种与相关对象一起使用的技术。我的观点是,应该使用延迟加载,因为它是查询对象图的sympton。

很多细节可以进入,所以我会坚持简短的回答:不要懒惰的属性/列并尝试从不延迟加载:)