LINQ Grundkurs

Anonyme Typen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Anonyme Typen sind Datenobjekte ohne Namen. Sie dienen dazu, Daten auf kompakte Weise zusammenzufassen.
09:08

Transkript

In diesem Video widmen wir uns anonymen Typen und dafür vergleichen wir sie mit konkreten Typen. Einen konkreten Typ habe ich angelegt, und zwar die Person. Und jetzt schauen wir uns an, wie so ein Typ normalerweise verwendet wird. Um einen Typ zu verwenden, brauchen wir zuerst eine Variable. Dafür schreiben wir meist den Typ und dann den Variablennamen. Dadurch weiß unser Compiler, unser Programm und so weiter, dass dies eine Variable ist. Denn Variablen werden zuerst durch ihren Typ bestimmt. Greife ich nun auf die Variable zu, sehe ich auch schon, was die alles kann. Die hat also einen Namen, die hat eine ID, und die hat diese typischen Methoden, die Objekte immer mitbringen bei .NET. Würde ich jetzt hier drauf zugreifen, wäre das eher ungünstig, denn ich habe ja noch gar keine Instanz von Person. Die muss ich überhaupt erst erzeugen. Das mache ich an dieser Stelle. Ich nehme den Variablennamen. Und über eine Zuweisung und den new-Operator weise ich eine neue Instanz dieses Typs zu. Zuweisung, new bedeutet Instanziierung, und Person ist letztendlich der Typ. Das, was wir hier hinten haben, ist die Auswahl des entsprechenden Konstruktors. Hätte ich mehrere Konstruktoren, wie ich das jetzt zum Beispiel mache, ctor, und der kriegt einen Integer-Wert, jetzt habe ich zwei Konstruktoren, dann hilft einfach diese Angabe hier hinten auszusagen, welchen Konstruktor sollen wir verwenden. Da es standardmäßig immer einen Konstruktor gibt und zwar den parameterlosen, hat es sich häufig so eingebürgert, dass man diese geschweiften Klammern schreibt, egal ob man sie braucht oder nicht, selbst wenn es halt nur einen Konstruktor gibt. So viel zu den konkreten Typen. Wie sieht das Ganze dann bei den anonymen aus? Anonym heißt ja, dass wir entsprechende Namen weglassen. Demnach können wir das weglassen. Und wir können das weglassen. Dem Visual Studio bringt es jetzt nicht allzu viel und dem Compiler auch nichts. Er wird uns nur anschreien und sagen, dass das nicht funktioniert. Denn er muss immer noch wissen, dass das überhaupt eine Variable ist. Und er kann mit diesem new() nichts anfangen, weil er den Typ nicht interpolieren kann. Er weiß ja nicht, welcher Typ hier zu verwenden ist. Aus diesem Grund wurde C# um ein Schlüsselwort für Platzhalter erweitert. Dieses nennt sich var. var sagt einfach nur aus, dass das, was danach kommt, die Bezeichnung einer Variable ist. So gesehen funktioniert es nicht. Denn damit der Compiler auflösen kann, was für einen Typ diese Variable hat, muss auch eine Wertzuweisung geschehen. Der Typ der Variable wird also zum Zeitpunkt ihrer Erzeugung über die Zuweisung definiert, und nicht über das, was hier vorne steht. Ich entferne also einmal den Platzhalter. Das da oben brauchen wir nicht mehr. Und jetzt kann er schon sehen, okay, es passiert eine Zuweisung, alle Fehler, die jetzt kommen, passieren später. Jetzt müssen wir ihm hier den Typ angeben, der der Variable zugewiesen werden soll. Der darf aber keinen Namen haben. Wenn er keinen Namen haben darf und wir wissen, dass es sowieso immer Klassen sind, kann man auch das hier getrost alles weglassen. Also was bleibt übrig? Geschweifte Klammern. Mit den geschweiften Klammern sage ich aus, da war Visual Studio etwas zu voreilig, dass er das, was hier hinten steht, instanziieren soll. Da dies aber grundsätzlich immer den gleichen Aufbau hat und keine weiteren Konstruktoren besitzen kann, können wir auch diese beiden Klammern entfernen. Das Einzige, was also bleibt, ist geschweifte Klammer auf, geschweifte Klammer zu. An dieser Stelle können wir auch schon auf dessen Eigenschaft zugreifen. Da haben wir wieder die üblichen Verdächtigen, die wir auch bei anderen Objekten finden: Also GetHashCode, um einen Hashcode auf Basis der Werte des Typs zu erzeugen. Mit Equals können wir zwei Objekte miteinander vergleichen. Mit GetType bekommen wir den aktuellen Typ zurück. Und mit ToString können wir die Werte, die der Typ besitzt, in einen String umwandeln, beziehungsweise eine String-Repräsentanz des gesamten Typs erzeugen. Ist toll, hat aber noch nicht viel Wert für uns, denn was wir eigentlich übertragen wollen, das sind Name und Id, genauso wie in unserer Person-Klasse. Um das tun zu können, müssen wir dem Typ jetzt also seine Properties mitgeben. Die werden einfach hier in die geschweiften Klammern geschrieben. Und bekommen dann auch einen Wert zugeordnet. Würde ich keinen Wert zuordnen, könnte der Compiler wieder nicht den Typ interpolieren, beziehungsweise Visual Studio kann es natürlich auch nicht, und demnach käme es zu Fehlern. Indem ich einen Typ angebe, beziehungsweise indem ich einen Wert angebe, kann dessen Typ verwendet werden für die Eigenschaft, die wir hier stehen haben, also Name. Das Gleiche kann ich dann auch mit Id machen. Und dann haben wir hier eine string Property und das ist eine int Property. Dieses Name = "", das bringt mir nicht viel, das ist ja ein Leerstring, also könnte ich versucht sein, diesem Leerstring einen anderen Wert zuzuweisen. Zum Beispiel Hendrik. Aber dann muss ich schon feststellen, das geht gar nicht, denn bei anonymen Typen sind alle Properties automatisch read-only. Das ist daher notwendig, weil man dazu gezwungen wird, ihnen einen Wert zuzuweisen und damit ihren Typ zu definieren. Was Sie schon sehen, ist, dass diese anonymen Typen zwar keinen Namen haben, sie sind insgesamt aber absolut typsicher. Das zeigt sich auch, wenn wir eine zweite Variable anlegen mit dem gleichen Typ. Jetzt weisen wir den Wert der einen Variable der anderen Variable zu. Ist gerade noch ein bisschen ungünstig, machen wir hinten daraus mal eine 2. Das funktioniert. Denn die beiden Variablen sind vom gleichen Typ. Und zwar, man sieht es auch hier, "a is new { string Name, int Id }". Das Gleiche gilt auch für person1. Beide haben den gleichen Typ. Es ändert sich, sobald ich die Reihenfolge der Properties ändere. Dann passiert es, dass wir hier einen anderen Typ haben. Dieser anonyme Typ ist jetzt vom Typ int, string, während dieser vom Typ string, int ist. Das sind also unterschiedliche Typen und damit funktioniert die Zuweisung nicht mehr. Das ist ein typischer Fehler, den man gerne einmal macht, wenn man mit anonymen Typen, mit anonymen Abfragen arbeitet, dass man an einer Stelle die Properties auf eine Weise schreibt und an einer anderen auf eine andere Weise probiert zuzuweisen. Das geht letztendlich nicht. Wobei, eingeschränkt ist der Fehler schon allein deshalb, weil anonyme Typen sind nur in ihrem Geltungsbereich verfügbar. Geltungsbereiche werden meistens durch Codeblöcke abgegrenzt, also das, was wir jetzt hier haben. person2 ist nur in diesem Codeblock gültig, genauso wie person1 nur in diesem Codeblock gültig ist. Also, Codeblöcke können auf Methode bezogen sein, auf Klassen bezogen sein, auf Schleifen bezogen sein, und so weiter und so fort. Möchte ich jetzt hier unten auf person2 zugreifen, dann geht das nicht, die steht mir einfach nicht zur Verfügung, weil sie eben nur in diesem Bereich gültig ist. Also, wir können anonyme Typen nicht als Rückgabewerte von Methoden angeben. Das geht einfach nicht. Wie werden sie dann letztendlich verwendet? Das sehen wir uns an, wenn wir eine entsprechend LINQ-Abfrage definieren. Aber das ist nicht Teil dieses Videos. Sie haben also gesehen, wie man anonyme Typen angibt, wie man sie ein Stück weit verwendet, und welche Einschränkungen sie haben. Wie sie tatsächlich in Kombination mit LINQ verwendet werden, das sehen Sie dann an den Stellen, wo die entsprechenden LINQ-Befehle erklärt werden.

LINQ Grundkurs

Lernen Sie die LINQ-Operationen kennen und erstellen Sie praktische Abfragen direkt in C# und .NET.

2 Std. 10 min (26 Videos)
Derzeit sind keine Feedbacks vorhanden...
Hersteller:
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:24.10.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!