2012-09-25 15 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

['Lazy '](http://msdn.microsoft.com/en-us/)を使用しない理由ライブラリ/ dd642331.aspx)?この記事を見て:[msdn:遅延初期化](http://msdn.microsoft.com/en-us/library/dd997286.aspx) –

+0

私はそれを読んだ - 問題は私がテストなしで理解していないです仕事で私たちは唯一の.Net 2.0(だから私はを使用することはできません) - 質問しないでください! – Dave

答えて

11

我々は

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

このコードの問題はFooをinstansiatingするExpensiveをinstansiatingのパフォーマンスコストが発生することをある構築に費用がかかるタイプのフィールド考えてみましょう - か - か-ないExpensiveフィールドをこれまでにアクセスされました。

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

これは怠惰instansiationです:明白な答えが遅延しにフィールドをinstansiateデマンドまたは上のインスタンスを構築することです。

+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

私はWikiのページを見ていました - しかし、怠惰な読み込み、怠惰な初期化と怠惰な評価、熱心な初期設定など - 私は(私の学習のこの初期の段階で)彼らはすべて異なっていると思っていました。私はその怠惰なinitを実現し始めている。 /怠惰な負荷は同じものです – Dave

+1

それは意味論です。それは異なる意味を持つことができます。クラスはlazy initにすることもできますが、クラスもlazyとしてメディアデータを遅延読み込みすることができます。 – Kache

関連する問題