2012-09-25 13 views
5

Ist faule Instanziierung über weniger Code verwenden, aber das gleiche Ergebnis erhalten? Sicher ist das im Allgemeinen eine gute Sache zu tun (vorausgesetzt, dass der Code zu kurz/effizient gemacht wird, beschädigt er die Lesbarkeit/Wartbarkeit nicht).Was ist faule Instanziierung

finden Sie in diese faul Instanziierung:

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(); 
    } 
} 

Es gibt kein Privateigentum von Instance ist (ich weiß, es ist implizit) - ist es das, was sie faul macht - die Tatsache, dass wir einen Setter haben nicht innerhalb die public static Singleton Instance Eigenschaft?

+1

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

+1

Warum benutzen Sie nicht ['Lazy '] (http://msdn.microsoft.com/en-us/ Bibliothek/dd642331.aspx)? Schau dir diesen Artikel an: [msdn: lazy initialization] (http://msdn.microsoft.com/en-us/library/dd997286.aspx) –

+0

Ich habe das gelesen - das Problem ist, dass ich ohne Test nicht verstehe und bei der Arbeit sind wir nur auf .Net 2.0 (so kann ich nicht verwenden ) - Fragen Sie nicht !! – Dave

Antwort

11

Lets sagen, dass wir ein Feld von einer Art, die teuer ist

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

Das Problem mit diesem Code zu konstruieren ist, dass Foo instansiating die Leistung Kosten entstehen Expensive von instansiating - ob-oder-nicht das Expensive Feld wird jemals zugegriffen. Die offensichtliche Antwort ist die Instanz auf Nachfrage oder lazily instansiate das Feld zu konstruieren:

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

Dies ist faul instansiation.

+1

Schlägst du vor, dass du jedes Feld auch lazy load machen kannst (vorausgesetzt, die Eigenschaft ist eine Klasse) – Dave

+0

Es würde keinen Sinn haben, träge instansiing etwas, das nicht zu initialisieren war. Das ist der springende Punkt. Sie können dies mit jeder gewünschten Klasse tun, indem Sie den Accessor auf diese Weise verwenden. – MoonKnight

+1

Es gibt einige gute Antworten auf meine Frage - aber diese * wirklich * ließ den Groschen fallen - und ließ mich über mehr Wege nachdenken, es zu implementieren. Obwohl es einfacher ist, es als effizientes Laden zu betrachten, anstatt es zu laden! :) – Dave

5

Nein, faule Instanziierung bedeutet, keine Zeit und Ressourcen zu verbringen etwas zu schaffen, bis Sie eigentlich brauchen es.

In Ihrem Singleton Beispiel ist die instance nur eine leere Referenz, bis sie tatsächlich verwendet wird. Wenn es verwendet wird, geben Sie dann die Ressourcen aus, um das Objekt mit einem new zu instanziieren.

+0

Ah - daher die Tatsache, es ist in der statischen Methode - rufen Sie es nur, wenn es ohne vorherige getan werden benötigt! – Dave

+0

Yeap. Auch für einen Singleton greifen zukünftige Aufrufe nur auf diese bereits erstellte Instanz zu. – Kache

+0

Ja, ich weiß jetzt über das Singleton! Es war der Ladentyp, den ich nicht bekommen habe, danke. – Dave

2

Es ist faul, weil die Instanz der Klasse Singleton nicht erstellt wird, bis Sie das erste Mal danach fragen.

2

Lazy Initialisierung eines Objekts bedeutet, dass seine Erstellung aufgeschoben wird, bis es erstmals verwendet wird.

Für vollständige Referenz siehe Msdn schreiben Lazy Initialization

In Ihrem obigen Code die Instanz der Singleton-Klasse wird erst erstellt, wenn Sie es nennen. Also, Ihr Programm wird keine Ressourcen verwenden, bis Ihr Code aufgerufen wird.

6

Lazy Initialisierung ist eine Praxis, bei der Sie nur ein Objekt laden oder initialisieren, wenn Sie es zuerst benötigen.

Potenziell kann dies zu einem großen Leistungsschub führen, insbesondere wenn Sie eine große Anzahl von Komponenten in Ihrer Anwendung haben.

Schauen Sie sich die Wikipedia Seite für eine größere Einsicht (es verfügt über codierte Beispiele).

+1

Ich hatte diese Wiki-Seite gesehen - aber faules Laden, faule Initialisierung und faule Auswertung, eifrige Initialisierung usw. - ließ mich denken (in diesem frühen Stadium meines Lernens), dass sie alle verschieden waren. Ich beginne zu erkennen, dass faul init./Lazy Load ist das Gleiche – Dave

+1

Nun, es ist Semantik. Es kann verschiedene Dinge bedeuten. Eine Klasse kann lazily init sein, aber vielleicht lädt die Klasse auch faul Mediendaten träge. – Kache