2012-09-25 87 views
5

是关于使用较少代码但得到相同结果的懒惰实例吗?当然,这通常是一件好事(提供使代码短/有效不会损害可读性/可维护性)。什么是懒惰实例化

请参阅此延迟实例:

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属性?

+1

http://msdn.microsoft.com/en-us/library/dd997286.aspx – user981225

+1

为什么你不使用['懒惰'](http://msdn.microsoft.com/en-us/库/ dd642331.aspx)?看看这篇文章:[msdn:lazy initialization](http://msdn.microsoft.com/en-us/library/dd997286.aspx) –

+0

我已阅读 - 问题是我不明白没有测试并在工作中,我们只在.Net 2.0(所以我不能使用) - 不要问! – Dave

回答

11

假设我们有一个类型,它是昂贵的领域,构建

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

的问题与此代码是instansiating Foo招致instansiating Expensive的性能成本 - 无论有或没有Expensive场被访问过。答案显然是建立在需要时或实例懒洋洋地instansiate领域:

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

这是懒惰instansiation。

+1

你是否建议你也可以让每个字段都是一个懒惰的负载(提供的属性是一个类) – Dave

+0

懒惰地实例化没有预期到初始化的任何东西都没有意义。这是整个观点。你可以用这种方式使用访问器来完成你想要的任何类。 – MoonKnight

+1

对我的问题有一些很好的答案 - 但是这真的使得这一分钱下降 - 并让我想到了更多的方式来实现它。虽然可能更容易将其视为有效加载而不是延迟加载! :) – Dave

5

不,懒惰的实例化意味着不会花费任何时间和资源来创建东西,除非你需要它实际上需要它。

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

+0

啊 - 因此它是在静态方法中的事实 - 只有在需要时才调用它,而不需要事先做任何事情! – Dave

+0

Yeap。对于单身人士,将来的呼叫也只是访问那个已经创建的实例。 – Kache

+0

是的,我现在知道单身人士了!这是我没有得到的装载类型,谢谢。 – Dave

2

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

2

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

有关完整的参考请参阅MSDN发布Lazy Initialization

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

6

延迟初始化是一种练习,您只需在第一次需要时加载或初始化对象

这可能会给您带来巨大的性能提升,尤其是在应用程序中有大量组件的情况下。

查看Wikipedia页面以获得更深入的了解(它具有编码示例)。

+1

我曾见过维基页面 - 但延迟加载,懒惰初始化和懒惰评估,急切的初始化等 - 让我觉得(在我学习的早期阶段)他们都是不同的。我开始意识到懒惰的init。 /懒加载是一样的东西 – Dave

+1

嗯,它的语义。它可以表示不同的事物。一个类可以懒惰地初始化,但也许这个类也懒惰地加载媒体数据。 – Kache