用户定义的属性是否懒惰或急于加载
本文关键字:于加载 加载 定义 属性 是否 用户 | 更新日期: 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不会运行)。属性的支持变量将初始化为其类型的默认值。
您应该加载整个对象(或聚合,在域驱动设计中称之为聚合)。延迟加载是一种用于相关对象的技术。我的观点是,应该而不是使用延迟加载,因为它是查询对象图的症状。
有很多细节可以深入研究,所以我会坚持简短的答案:不要懒惰属性/列,并尝试从不懒惰加载:)