Visual C# 2012 Grundkurs

Konversion von Objekten

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Objekte beliebiger Typen können in C# jederzeit in den Basistyp Object umgewandelt werden. Bei Bedarf besteht die Möglichkeit, ein Object wieder in einen anderen Typ zu konvertieren.

Transkript

In diesem Abschnitt möchte ich die Konversion von Objekten zeigen. Zu dem Zweck schreibe ich eine kleine Testklasse. Die soll "Mitarbeiter" heissen. Die hat ein paar Felder: "Vorname", "Nachname", und einen öffentlichen Konstruktor. In dem Konstruktor weisen wir den lokalen Vornamen zu und ebenso mit dem Nachnamen. Dann benutze ich gerade so ein Tool, es füllt mir um die beiden Felder Properties herum, so dass ich von außen auf sie zugreifen kann. Wunderschön! Mit den Mitarbeitern können wir nämlich jetzt was machen, wir können ihn einfach anlegen. Dann hätten wir den Code komplett und er kompiliert und funktioniert. Was ich aber an der Stelle jetzt auch machen kann, ist Folgendes: Object 0 = new Mitarbeiter. Und dann kann ich hier zum Beispiel dieses Objekt auf der Konsole ausgeben. Ich probiere das gerade mal aus und siehe da, es erscheint was auf der Konsole und zwar der Name des Typs des jeweiligen Objekts, weil das ist ja die Default-Implementierung von To String. Sie wissen ja, dass man To String, wenn man das überschreibt, dann kann man das Verhalten ändern. Das will ich an der Stelle mal eben schnell zeigen: Vorname plus... Wenn ich den Code jetzt nochmal neu ausführe, dann erscheint da auf der Konsole tatsächlich irgendetwas Sinnvolles mit diesen Mitarbeitern. Soweit schön und gut. Man kann einem Objekt x-beliebiges in .NET zuweisen, weil ja alles in .NET ein Objekt ist. Aber, mit so einem Objekt kann man natürlich nur begrenzt was anfangen. Man kann also gerade so hier Methoden aufrufen; equals get hash value to string und Get type, den Typ von dem Objekt, abrufen. D.h. da sind meine Möglichkeiten schon etwas beschränkt. Also wird der Standardfall, wenn ich so ein Objekt irgendwo im System herumreiche, irgendwann einmal dieses Objekt in ein konkreten Typ umwandeln möchte. Das passiert jetzt eben hier: Mitarbeiter M equals O. Wenn ich das kompiliere, bekomme ich einen Fehler. Ist klar, weil das System kann nicht wissen, was in diesem Objekt drin steckt. Insofern kann diesen Objekt nicht implizit einem Mitarbeiter zugewiesen werden. Aber ich kann an der Stelle immer sagen: Ich weiss, das ist ein Mitarbeiter, das muss ein Mitarbeiter sein und jetzt, mache mir einmal einen draus. Und dann kann ich mit diesem Mitarbeiterobjekt auch tatsächlich irgendetwas machen. Ich drucke hier gerade den Vornamen aus. Maskiere diese Zeile einmal aus, dann ist der Vorname das Einzige, was am Bildschirm erscheint und starte das Programm. Siehe da, unser Vorname ist da. Also, das heißt diese Konversion hat geklappt, ich konnte die Objekte wieder zurückverwandeln in einen Mitarbeiter. Jetzt mag der eine oder andere schon einmal die Frage stellen, ist so etwas sinnvoll. Wieso soll irgendjemand ein konkretes Objekt in ein Object verwandeln und dann wieder zurück. Es kommt häufiger vor, als Sie glauben. Sie brauchen manchmal Klassen, die irgendeine Verwaltung für Objekte aller Art übernehmen und solche Klassen finden sich zum Beispiel im memsetsystem.collections. Vor .Net 2.0 gab es nur diese Klassen. Die musste man also verwenden, um so etwas wie erweiterbare Listen zu haben. Da gab es zum Beispiel die Klasse ArrayList. Ich lege gerade so eine ArrayList an. Und jetzt kann ich diese ArrayList, der kann ich jetzt ein Mitarbeiterobjekt zufügen. Jetzt kann ich ein anderes Objekt hinzufügen, das nennen wir jetzt einmal irgendwie anders. OK, und irgendwann später benutzt man diese Liste wieder. Und dann kann man irgend so einen Code schreiben wie I=0, I < al.count i++ der ganze Code wird dann eben in der Schleife ausgeführt. Und jetzt möchte ich eben hier einen Mitarbeiter wieder aus dieser Liste herausziehen. Aber wie mache ich das? Also was ich auf jeden Fall bekommen kann, das ist so was hier, das funktioniert. Aber was nicht funktioniert, das ist das hier. Warum? Weil diese ArrayList, das zeigt uns Intellisense ganz gut, die gibt an der Stelle einfach nur ein Object heraus. Also alles, was ich hier habe, ist ein Object. Und jetzt habe ich genau die Situation. Wenn ich jetzt weiß, in dieser Liste stecken nur Mitarbeiter, dann bin ich an der Stelle eigentlich relativ gut bedient. Ich kann also jetzt hier so eine direkte Konversion vornehmen des Elements, indem ich diesen Ausdruck, der das Objekt besorgt, den Typ in Klammern voranstelle und dann kann ich das Objekt als Mitarbeiter benutzen. Ich starte den Code jetzt einmal und man sieht, die ganze Sache funktioniert. Und wenn man jetzt den Code noch erweitert, hätte man hier noch die Vor- und die Nachnamen. Schön und gut. Drehen wir es einmal so um. Ich kopiere einmal die Klasse "Mitarbeiter" und mache daraus eine zweite Klasse, die der Klasse sehr ähnlich ist. Sagen wir einmal die Klasse soll "Manager" heissen. Jetzt habe ich also zwei Klassen, die sind sich sehr ähnlich und es passiert mir dieses kleine Malheur, dass ich hier nämlich einen Manager mit einem Mitarbeiter zusammen in die gleiche Liste gebe. Wenn ich den Code jetzt ausführe, der kompiliert wunderbar, aber ich bekomme eine Invalid Cast Exception und diese Exception sagt mir, dieses Objekt des Typus Manager kann nicht in "Mitarbeiter" umgewandelt werden. Jetzt ist guter Rat teuer. Was kann ich in dieser Schleife tun, damit sie mir nicht gerade auf eine Exception läuft. Da habe ich prinzipiell zwei Möglichkeiten. Die Möglichkeit Nummer 1 ist... Moment einmal, jetzt brauche ich da noch einmal das Object O = AL von I. Jetzt habe ich ein Objekt. Jetzt kann ich sagen if O ist "Mitarbeiter". Mit denen kann ich jetzt ganz konkret nachfragen, ist dieses entsprechende Objekt ein Objekt vom Typ "Mitarbeiter". Wenn das der Fall ist, wird der Code ausgeführt. Wenn das nicht der Fall ist, wird er nicht ausgeführt. So, und wenn ich das Ganze jetzt laufen lasse, ist der Fehler weg und es kommt jetzt nur noch das Objekt aus der Liste, das auch wirklich nur ein Mitarbeiter ist. Der Manager ist dann draussen. Es gibt aber noch eine zweite Möglichkeit. Tatsächlich ist es so, diese Schlüsselwort ist, wenn man da in den IL-Code reinschauen würde, dann würde man sehen, dass dieser IL-Code zunächst einmal eine Konversion in einen Mitarbeiter versucht und dann einfach austestet: Ist das ein Mitarbeiter, ja oder nein? Und an der Stelle ist es aber so, dass ich ja jetzt hier noch mal eine Konversion mache. Wir hätten jetzt praktisch zwei Konversionen. Die eine Konversion, die passiert hier implizit, und die andere passiert hier explizit. Mal davon abgesehen, dass ich diese AL von I, da kann ich eigentlich auch O schreiben, weil ich habe das Objekt hier schon aus der ArrayList raus gezogen. Aber dennoch ist es so: Hier passiert die eine Konversion und hier passiert eine. Und dann ist natürlich die Frage: Geht das auch effektiver? Und die Antwort heißt: Ja, es geht. Und zwar kann ich an der Stelle jetzt Mitarbeiter M equals O As Mitarbeiter Also dieses As, Schlüsselwort, das sagt so viel wie, konvertiere mir das Objekt in diesem Typ und wenn es gut geht, dann gib mir das Objekt; und wenn es nicht gut geht, dann gib mir an der Stelle eine Null. Und jetzt kann ich hier abfragen: If M ungleich Null. Und jetzt kann ich den ganzen Kram heraus werfen, weil ich nämlich diesen Mitarbeiter, den ich da oben erzeugt habe, den kann ich gleich wieder verwenden, sofern er eben ungleich Null ist. Ich starte den Code mal, und siehe da: Er funktioniert wie gehabt. Aber er ist ein kleines bisschen effizienter. Das war es jetzt soweit mit diesem Abschnitt zur Konversion von Objekten und zu den beiden Schlüsselworten As und Is.

Visual C# 2012 Grundkurs

Schreiben Sie eigene Programme in C# und lernen Sie dazu alle Schlüsselwörter und die meisten Konstrukte kennen, um sicher mit dieser Programmierspreche umzugehen.

7 Std. 1 min (44 Videos)
Derzeit sind keine Feedbacks vorhanden...

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!