TOC

This article has been localized into German by the community.

Datenarten:

Dynamic-Typ

In der C# Version 4.0 hat Microsoft einen neuen Typ eingeführt: den dynamischen. Es ist eigentlich ein statischer Typ, aber im Gegensatz zu anderen statischen Typen werden die (potentiellen) Mitglieder eines dynamischen Objekts nicht vom Compiler überprüft. Dadurch erhalten Sie einige der Vorteile der dynamisch / schwach typisierten Sprachen, während Sie die Vorteile von stark typisierten Sprachen in allen anderen Fällen beibehalten.

Die Deklaration eines dynamischen Typs ist wie die Deklaration jedes anderen Typen - verwenden Sie einfach das dynamic Schlüsselwort anstelle des Datentyps:

dynamic d1;
dynamic d2 = "A string";
dynamic d3 = 42;

Jetzt haben Sie drei verschiedene Objekte - das erste ist wirklich nichts an diesem Punkt (null), während das zweite eine Zeichenfolge ist und das dritte eine ganze Zahl. Der Interpreter entscheidet das automatisch zur Laufzeit, basierend auf dem, was Sie den Variablen zuweisen. Das bedeutet auch, dass der Compiler nicht prüft, was Sie mit diesen Variablen tun, wie das nächste Beispiel zeigt:

dynamic d1;
dynamic d2 = "A string";
dynamic d3 = 42;
Console.WriteLine(d2.Length);
Console.WriteLine(d3.Length);

Strings haben eine "längen-Eigenschaft", um zu entscheiden, wie lang die Zeichenfolge ist, aber eine Ganzzahl nicht. In diesem Fall versuche ich, diese Eigenschaft für beide Variablen zu verwenden, und der Compiler wird sich darüber nicht beschweren. Wenn diese Variablen als String und Integer deklariert wären, hätte sie der Compiler abgefangen. Da die Typen jedoch dynamisch sind, wird nur kompiliert und ausgeführt. Sobald jedoch der Interpreter die letzte Zeile erreicht, wird eine Exception ausgelöst, da Sie offensichtlich nicht auf eine Eigenschaft zugreifen können, die nicht existiert.

Dies zeigt auch die Gefahr der dynamischen Typen - Sie müssen sich dessen bewusst sein und sicherstellen, dass Sie jeden Property- und Methodenaufruf korrekt buchstabieren, da der Compiler Ihre Arbeit nicht doppelt überprüft, sodass Sie im Grunde Code veröffentlichen können, der jedes Mal fehlschlägt.

Ein dynamisches Objekt

Das "dynamic" Schlüsselwort kann natürlich für weitaus komplexere Typen als nur Integer und Strings verwendet werden. Ein gutes Beispiel hierfür ist, wenn ein anonymes Objekt wie folgt verwendet wird:

dynamic user = new
{
    Name = "John Doe",
    Age = 42
};
Console.WriteLine(user.Name + " is " + user.Age + " years old");

Dadurch können Sie ein Objekt erstellen, ohne zuerst eine Klasse dafür zu definieren. Das dynamic Schlüsselwort kann verwendet werden, um das Objekt zu halten, aber auch das var Schlüsselwort, das in vielen Situationen besser geeignet sein könnte.

Sie könnten denken, dass Sie, da der Typ dynamisch ist, einfach später Eigenschaften hinzufügen können:

dynamic user = new
{
    Name = "John Doe",
    Age = 42
};
user.HomeTown = "New York";

Da zu einem dynamischen Typ keine Kompilierzeitprüfung durchgeführt wird, wird dieser Code tatsächlich ausgeführt, da der Compiler das Vorhandensein der Eigenschaft HomeTown nicht tatsächlich überprüft, aber sobald die letzte Zeile erreicht ist, wird eine Ausnahme ausgelöst. Während ein dynamischer Typ sehr dynamisch ist, können Sie ihm dynamisch keine Eigenschaften hinzufügen. Dafür können Sie ein "ExpandoObject" verwenden, das wir im nächsten Artikel besprechen werden.

Typ ändern

Eine als dynamisch deklarierte Variable ist überhaupt nicht immer typlos. Stattdessen behandelt C# intern das Objekt, das Sie ihm zugewiesen haben. In unserem allerersten Beispiel werden Sie sehen, wie wir eine Variable als dynamisch deklarieren, ihr entweder eine Zeichenkette oder eine Ganzzahl zuweisen und dann Eigenschaften verwenden können, die zu diesen Typen gehören. Sie können jedoch den Typ einer dynamischen Variablen einfach ändern - weisen Sie ihr einfach einen neuen Wert zu. Hier ist ein Beispiel:

dynamic user = new
{
    Name = "John Doe",
    Age = 42
};
Console.WriteLine(user.GetType() + ": " + user.Name + " is " + user.Age + " years old");
user = "Jane Doe";
Console.WriteLine(user.GetType() + ": String.Length = " + user.Length);

Beachten Sie, wie wir die Variable dynamic user verwenden: Zuerst wird ein anonymes Objekt gespeichert und dann wird ihm eine einfache Zeichenfolge zugewiesen. Wir validieren es mithilfe der "GetType()" -Methode, die für alle C# -Objekte gefunden wird, und in beiden Fällen greifen wir auf Eigenschaften zu, die auf dem aktuellen Typ (Eigenschaften des ersten Namens / Alters des anonymen Objekts und dann der auf String-Objekten gefundenen Length-Eigenschaft basieren).

Zusammenfassung

Mit dem Schlüsselwort "dynamic" können Sie Variablen verwenden, die nicht typspezifisch sind. Stattdessen fungieren sie als die Art von Daten, die sie enthalten. Sie können einer dynamischen Variablen einfach einen neuen Wert zuweisen, und wenn der Typ des Werts, den Sie zuweisen, nicht derselbe Wert ist, wie er derzeit gilt, ändert die dynamische Variable den Typ einfach automatisch.

Dynamische Variablen werden vom Compiler nicht geprüft, sodass Sie auf Eigenschaften zugreifen können, die vorhanden sein können oder nicht. Dies macht sie sehr flexibel, aber es macht auch Ihre Anwendungen viel anfälliger für Fehler. Vor allem aus diesem Grund sollten Sie die Verwendung der dynamischen Schlüsselwörter auf Situationen beschränken, in denen Sie nicht erreichen können, was Sie wollen, ohne sie zu verwenden. Beispiele dafür, wann es sinnvoll ist, das dynamische Schlüsselwort zu verwenden, sind COM Interop und die Interaktion mit Datenformaten wie JSON und XML.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!