用户定义的属性是否懒惰或急于加载

本文关键字:于加载 加载 定义 属性 是否 用户 | 更新日期: 2023-09-27 18:21:20

在C#中,当您具有属性时:

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

当你从数据库中获取一个人时:

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

是立即评估AnIntegerValue,还是代码等待:

mike.AnIntegerValue

我想知道,因为如果要在属性中放入大量逻辑,并且它已被加载,那么这显然会影响性能。

用户定义的属性是否懒惰或急于加载

不会立即评估属性。它们在访问"get"修饰符时进行评估。

解释:

归根结底,函数和属性之间没有真正的区别
含义:

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

相当于:

Public int get_AnIntegerValue()
  {
      //Some logic
      return somevalue;  
  }

事实上,这正是您的属性被编译的目的(如果您在调试时遵循堆栈,您可以看到这一点)。

所以,以同样的方式,函数不会立即被评估,属性也是如此,您可以使用它们,而不必担心额外的性价比。

您可以看看这个线程,了解一些关于何时使用属性以及何时函数将是更好、更优雅的方法的指导原则。

这取决于GetPerson()的实现。默认情况下,当实例化一个类时,不会计算其属性(getter不会运行)。属性的支持变量将初始化为其类型的默认值。

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

有很多细节可以深入研究,所以我会坚持简短的答案:不要懒惰属性/列,并尝试从不懒惰加载:)