【问题标题】:virtual properties and lazy loading虚拟属性和延迟加载
【发布时间】:2012-01-11 23:11:19
【问题描述】:

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

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

【问题讨论】:

    标签: c# properties virtual lazy-loading


    【解决方案1】:

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

    【讨论】:

    • Nhibernate 会继承你的类吗?
    • 是的,这就是它需要virtual 的原因。这样,它可以用代码替换您的属性,以便在访问时获取数据。
    • @ChrisAnnODell 如何在运行时继承一个类?没有办法通过反射来实现这一点
    • 它似乎通过吐出 IL 来做到这一点,虽然这只是一个代理实现:github.com/nhibernate/nhibernate-core/blob/master/src/…
    【解决方案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,无论它们是否已加载。

    【讨论】:

    • 如果他无法访问 Lazy 怎么办?以及如何通过虚拟/覆盖实现懒惰?我认为这就是 OP 的意思。
    • 手动懒惰。让我具体说明一下。
    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2017-12-28
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2014-07-26
    相关资源
    最近更新 更多