当你拥有一个属性时,在C#中:
public class Person
{
public int AnIntegerValue
{
get
{
//Some logic
return somevalue;
}
}
}
当你从数据库中找到一个人时:
var mike = Uow.GetPerson("Mike");
是立即评估的AnIntegerValue,或代码是否等待:
mike.AnIntegerValue
我很想知道,因为如果要在属性中添加大量逻辑并且它是急切加载的话,这显然会影响性能。
答案 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。
很多细节可以进入,所以我会坚持简短的回答:不要懒惰的属性/列并尝试从不延迟加载:)