So führen Sie eine verzögerte Initialisierung in C # durch
Die verzögerte Initialisierung ist eine Technik, die die Erstellung eines Objekts aufschiebt, bis es zum ersten Mal benötigt wird. Mit anderen Worten, die Initialisierung des Objekts erfolgt nur bei Bedarf. Beachten Sie, dass die Begriffe "verzögerte Initialisierung" und "verzögerte Instanziierung" dasselbe bedeuten - sie können austauschbar verwendet werden. Indem Sie die verzögerte Initialisierung nutzen, können Sie die Leistung der Anwendung verbessern, indem Sie unnötige Berechnungen und Speicherverbrauch vermeiden. In diesem Artikel werden wir uns ansehen, wie wir eine verzögerte Initialisierung in C # durchführen können.
Lassen Sie uns das verzögerte Laden anhand eines einfachen Beispiels verstehen. Betrachten Sie zwei Klassen Customer
und Order
. Die Customer
Klasse enthält eine Orders
Eigenschaft, die wiederum auf eine Sammlung von Instanzen der Order
Klasse verweist . Die Orders
Sammlung kann eine große Datenmenge enthalten und benötigt möglicherweise sogar eine Datenbankverbindung, um eine Verbindung zur Datenbank herzustellen und Datensätze abzurufen. In einem solchen Fall macht es keinen Sinn, Daten in die Orders
Eigenschaft zu laden, bis wir die Daten benötigen. Durch die verzögerte Initialisierung können wir die Orders
Sammlung nur laden, wenn die Daten angefordert werden.
Verwenden der Lazy-Klasse in C #
Obwohl Sie Ihren eigenen benutzerdefinierten Code schreiben können, um die verzögerte Initialisierung zu implementieren, empfiehlt Microsoft, stattdessen die Lazy
Klasse zu verwenden. Die Lazy
Klasse im System
Namespace in C # wurde als Teil von .Net Framework 4.0 eingeführt, um eine thread-sichere Möglichkeit zum Implementieren einer verzögerten Initialisierung bereitzustellen. Sie können diese Klasse nutzen, um die Initialisierung ressourcenintensiver Objekte in Ihrer Anwendung zu verschieben.
Wenn Sie die Lazy
Klasse verwenden, müssen Sie im Typargument den Objekttyp angeben, den Sie träge erstellen möchten. Beachten Sie, dass beim Zugriff auf die Lazy.Value
Eigenschaft eine verzögerte Initialisierung erfolgt . Hier ist ein Beispiel, wie die Lazy
Klasse verwendet werden kann:
FaulBestellungen = neue Lazy (); IEnumerable result = lazyOrders.Value;
Betrachten Sie nun zwei Klassen Author
und Blog
. Ein Autor kann viele Blog-Beiträge schreiben, sodass Sie eine Eins-zu-Viele-Beziehung zwischen Author
und und Blog
Klassen haben, wie im folgenden Code-Snippet gezeigt.
öffentliche Klasse Autor{
public int Id {get; einstellen; }}
öffentliche Zeichenfolge Vorname {get; einstellen; }}
öffentlicher String Nachname {get; einstellen; }}
öffentliche Zeichenfolge Adresse {get; einstellen; }}
öffentliche Liste Blogs {get; einstellen; }}
}}
öffentlicher Blog
{
public int Id {get; einstellen; }}
öffentlicher String Titel {get; einstellen; }}
public DateTime PublicationDate {get; einstellen; }}
}}
Beachten Sie, dass die Eins-zu-viele - Beziehung zwischen dem Author
und Blog
Klassen hat vertreten mit List
Eigenschaft (vom Typ Blog
in der) Author
Klasse. Mit dieser Eigenschaft kann die Author
Klasse eine Sammlung von einer oder mehreren Instanzen der Blog
Klasse enthalten.
Angenommen, wir müssen nur die Details eines Autors (Vorname, Nachname und Adresse) in der Benutzeroberfläche anzeigen. In diesem Fall macht es keinen Sinn, die Blog-Details für den Autor zu laden. Wir möchten die Blog-Details träge laden. Hier ist die aktualisierte Author
Klasse, die diese Anforderung erfüllt. Beachten Sie die Verwendung der Lazy
Klasse.
öffentliche Klasse Autor{
public int Id {get; einstellen; }}
öffentliche Zeichenfolge Vorname {get; einstellen; }}
öffentlicher String Nachname {get; einstellen; }}
öffentliche Zeichenfolge Adresse {get; einstellen; }}
öffentlich faul
Blogs => new Lazy (() => GetBlogDetailsForAuthor (this.Id)); private IList GetBlogDetailsForAuthor (int Id)
{
// Schreiben Sie hier Code, um alle Blog-Details für einen Autor abzurufen.
}}
}}
Verwenden der generischen Lazy-Klasse in C #
Schauen wir uns nun an, wie wir eine generische Lazy
Klasse nutzen können, um das Singleton-Entwurfsmuster zu implementieren. (Sie können meinen Artikel über das Singleton-Entwurfsmuster hier lesen.) Die folgende Version der StateManager
Klasse ist threadsicher. Gleichzeitig wird eine verzögerte Initialisierung demonstriert. Beachten Sie, dass der explizite statische Konstruktor verwendet wurde, um sicherzustellen, dass der C # -Compiler den Typ nicht als markiert beforefieldinit
.
öffentliche versiegelte Klasse StateManager{
privater StateManager ()
{
}}
öffentliche statische StateManager-Instanz
{
bekommen
{
return Nested.obj;
}}
}}
Privatklasse verschachtelt
{
statisch verschachtelt ()
{
}}
interner statischer schreibgeschützter StateManager obj = neuer StateManager ();
}}
}}
Hier ist eine verzögerte Implementierung der StateManager
Klasse, die die Lazy
Klasse nutzt . Sie können sehen, wie die Lazy
Klasse es wirklich einfach macht, Faulheit zu implementieren.
öffentliche Klasse StateManager{
privat statisch schreibgeschützt Lazy obj = new Lazy (() => new StateManager ());
privater StateManager () {}
öffentliche statische StateManager-Instanz
{
bekommen
{
return obj.Value;
}}
}}
}}
Schauen Sie sich die Instance
Immobilie in der StateManager
obigen Klasse an. Beachten Sie, dass die Value
Eigenschaft, die Sie im obigen Codebeispiel sehen, schreibgeschützt ist. Aus diesem Grund gibt es keinen eingestellten Accessor.
Die verzögerte Initialisierung ist eine hervorragende Technik zur Leistungsoptimierung, mit der Sie die Initialisierung von Objekten, die erhebliche CPU- und Speicherressourcen verbrauchen, verschieben können, bis Sie sie unbedingt benötigen. Nutzen Sie die verzögerte Initialisierung, um die Leistung Ihrer Apps zu verbessern.