Tipps und Tricks rund um .NET und Visual Studio

Framework Class Library Verzögertes Instanziieren mit Lazy
Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne „.NETversum“ ihr Expertenwissen rund um .NET-Tools und WPF mit.

Mit der generischen Klasse Lazy besteht die Möglichkeit, die Erzeugung eines Objektes bis zu dessen erster Verwendung hinauszuzögern. Zur Demonstration beinhaltet Listing 2 eine Klasse Atomkraftwerk. Da die Investitionskosten für AKWs bekanntlich hoch sind, soll die Instanziierung eines solchen nur dann erfolgen, wenn es wirklich benötigt wird. Aus diesem Grund wird in Listing 3 die Klasse Lazy herangezogen. Zunächst wird eine Instanz von Lazy erzeugt. Mit der Eigenschaft IsValueCreated wird geprüft, ob das AKW bereits instanziiert wurde. Da es davor noch keine Verwendung fand, wird false geliefert. Anschließend wird über Value auf das AKW zugegriffen und mittels Start das Hochfahren des AKWs veranlasst. Dieser erstmalige Zugriff auf Value veranlasst die Instanziierung. Ab diesem Zeitpunkt liefert Value diese Instanz. Ein nochmaliges Abrufen von IsValueCreated liefert somit true.

Listing 2

class Atomkraftwerk
{
public Atomkraftwerk()
    {
Console.WriteLine("Konstruktor: AKW");
    }

public int Id { get; set; }
public void Start()
    {
Console.WriteLine("AKW #{0} nimmt Betrieb auf ...", Id);
    }

public void Stop()
    {
Console.WriteLine("AKW {0} stoppt Betrieb ...", Id);
    }
}  
Listing 3

Lazy lazyInvestment = new Lazy();
Console.WriteLine("IsValueCreated: " + lazyInvestment.IsValueCreated);
lazyInvestment.Value.Start();
Console.WriteLine("IsValueCreated: " + lazyInvestment.IsValueCreated);  

Für Fälle, in denen vor der ersten Verwendung weitere Vorbereitungsaufgaben durchzuführen sind, bietet Lazy auch das hinterlegen einer Factory-Methode in Form eines Lambda-Ausdrucks an. In Listing 4 kommt beispielsweise eine Factory-Methode, welche auch die ID des Atomkraftwerkes vergibt, zum Einsatz.

Listing 4

Lazy lazyInvestment2 =
new Lazy(() =>
    {
Atomkraftwerk akw = new Atomkraftwerk();
akw.Id = 4711;
return akw;
    });

Console.WriteLine("IsValueCreated: " + lazyInvestment2.IsValueCreated);
lazyInvestment2.Value.Start();
Console.WriteLine("IsValueCreated: " + lazyInvestment2.IsValueCreated);  

Auch das Threading-Verhalten kann über den Konstruktor von Lazy beeinflusst werden. Eine Überladung des Konstruktors erwartet dazu beispielsweise ein boolsches Argument isThreadSave. Der Wert true bewirkt hier, dass mittels Sperren sichergestellt wird, dass das gewünschte Objekt nur ein einziges Mal erzeugt wird, auch wenn mehrere Threads gleichzeitig die erste Ausführung von Value anstoßen.

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer arbeiten bei www.IT-Visions.de als Softwarearchitekten, Berater und Trainer für .NET-Technologien. Dabei unterstützen sie zahlreiche Unternehmen beim Einsatz von .NET und entwickeln selbst in größeren Projekten. Sie haben zahlreiche Fachbücher geschrieben und gehören seit vielen Jahren zu den Hauptsprechern auf der BASTA!. Manfred Steyer ist zudem für den Fachbereich „Software Engineering“ der Studienrichtung „IT und Wirtschaftsinformatik“ an der FH CAMPUS 02 in Graz verantwortlich. Dr. Holger Schwichtenberg unterrichtet in Lehraufträgen an den Fachhochschulen Münster und Graz.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -