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財産内にセッターを持っていないという事実?

4

5 に答える 5

13

構築に費用がかかるタイプのフィールドがあるとしましょう

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

このコードの問題は、フィールドにアクセスするかどうかに関係なく、Fooインスタンス化によってインスタンス化のパフォーマンスコストが発生することです。明白な答えは、オンデマンドでインスタンスを構築するか、フィールドを怠惰にインスタンス化することです。ExpensiveExpensive

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

これは怠惰なインスタンス化です。

于 2012-09-25T13:37:56.223 に答える
6

レイジー初期化は、最初にオブジェクトが必要になったときにのみオブジェクトをロードまたは初期化する方法です。

潜在的に、これにより、特にアプリケーションに大量のコンポーネントがある場合に、パフォーマンスが大幅に向上する可能性があります。

より深い洞察については、ウィキペディアのページを参照してください(コード化された例が特徴です)。

于 2012-09-25T13:32:22.710 に答える
5

いいえ、怠惰なインスタンス化とは、実際に必要になるまで、何かを作成するために時間とリソースを費やさないことを意味します。

シングルトンの例では、instance実際に使用されるまで、は単なる空の参照です。使用する場合、リソースを使用してオブジェクトを。でインスタンス化しますnew

于 2012-09-25T13:31:39.613 に答える
2

クラスのインスタンスはSingleton、最初に要求するまで作成されないため、怠惰です。

于 2012-09-25T13:31:47.277 に答える
2

オブジェクトの遅延初期化とは、最初に使用されるまでオブジェクトの作成が延期されることを意味します。

完全なリファレンスについては、msdn postLazyInitializationを参照してください

上記のコードでは、シングルトンクラスのインスタンスは、呼び出すまで作成されません。したがって、コードが呼び出されるまで、プログラムはリソースを使用しません。

于 2012-09-25T13:32:00.257 に答える