【问题标题】:What is lazy instantiation什么是惰性实例化
【发布时间】:2012-09-25 13:29:58
【问题描述】:

延迟实例化是否使用更少的代码但获得相同的结果?当然,这通常是一件好事(只要使代码简短/高效不会损害可读性/可维护性)。

请参考这个惰性实例化:

public sealed class Singleton
{
    private Singleton()
    {
    }

    public static Singleton Instance { get { return Nested.instance; } }

    private class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
} 

Instance 没有私有属性(我知道这是隐含的)- 是不是让它变得懒惰- 事实上我们在 public static Singleton Instance 属性中没有设置器?

【问题讨论】:

标签: c# lazy-initialization


【解决方案1】:

假设我们有一个构造昂贵的类型的字段

class Foo
{
    public readonly Expensive expensive = new Expensive();
    ...
}

此代码的问题在于,实例化 Foo 会导致实例化 Expensive 的性能成本 - 无论是否访问过 Expensive 字段。显而易见的答案是按需构造实例或惰性实例化该字段:

class Foo
{
    Expensive _expensive;
    public Expensive
    {
        get
        {
            if (_expensive == null) _expensive = new Expensive();
            return _expensive;
        }
    }
    ...
}

这是惰性实例化。

【讨论】:

  • 您是否建议您也可以使每个字段都成为延迟加载(假设属性是一个类)
  • 懒惰地实例化任何初始化不昂贵的东西是没有意义的。这就是重点。您可以通过这种方式使用访问器对任何您想要的类执行此操作。
  • 我的问题有一些很好的答案——但这真的让我一分钱一分货——让我想到了更多的方法来实现它。尽管将其视为高效加载而不是延迟加载可能更容易! :)
【解决方案2】:

延迟初始化是一种仅在第一次需要时加载或初始化对象的做法。

这可能会给您带来很大的性能提升,尤其是当您的应用程序中有大量组件时。

查看Wikipedia 页面以获得更深入的了解(其中包含编码示例)。

【讨论】:

  • 我看过那个 Wiki 页面 - 但是延迟加载、延迟初始化和延迟评估、急切初始化等 - 让我认为(在我学习的早期阶段)它们都是不同的。我开始意识到那个懒惰的初始化。 /懒加载是一样的
  • 嗯,这是语义。它可以表示不同的意思。一个类可以延迟初始化,但也可能该类也延迟加载媒体数据。
【解决方案3】:

不,惰性实例化意味着在您真正需要之前不要花费任何时间和资源来创建某些东西。

在您的单例示例中,instance 只是一个空引用,直到它被实际使用。当它被使用时,然后你花费资源用new实例化对象。

【讨论】:

  • 啊-因此它在静态方法中-仅在需要时才调用它,而无需事先做任何事情!
  • 是的。同样对于单例,未来的调用将只访问一个已经创建的实例。
  • 是的,我现在知道单例了!这是我没有得到的加载类型,谢谢。
【解决方案4】:
对象的

延迟初始化意味着它的创建被推迟到第一次使用。

完整参考见msdn帖子Lazy Initialization

在您上面的代码中,在您调用它之前不会创建单例类的实例。 因此,在您的代码被调用之前,您的程序不会使用资源。

【讨论】:

    【解决方案5】:

    这是懒惰的,因为 Singleton 类的实例直到您第一次请求时才创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      相关资源
      最近更新 更多