虚拟属性和延迟加载

时间:2012-01-11 23:11:19

标签: c# properties virtual lazy-loading

根据定义,虚拟属性或方法是要被覆盖的子类可见的方法。但是,例如NHibernate使用虚拟属性来确保延迟加载。

我的问题不是关于NHibernate,而是如何使用虚拟属性来实现延迟加载?是否有任何关于我不知道的虚拟属性的隐藏行为?

2 个答案:

答案 0 :(得分:9)

它们被声明为虚拟的事实允许NHibernate覆盖属性并为其创建代理实现 - 反过来它们可以用来在第一次访问属性时实现延迟加载。

答案 1 :(得分:2)

virtual成员背后没有隐藏的行为。除了不那么隐蔽的事实,他们可以在子类中被覆盖。

使用Lazy<T>类可以实现延迟加载。其中T是要加载的类型。它会隐式转换为T

或者如果你想手动设置属性以表现懒惰,你可以使用这样的东西:

private SomeType _someProperty = null;
public override SomeType SomeProperty
{
    get
    {
        if (_someProperty == null)
        {
            // Load _someProperty
        }
        return _someProperty;
    }
}

使用ValueTypes,您可以选择将它们设为Nullable<T>。或者介绍bool是否加载。