Visual C# 2012 Grundkurs

Unterschiede: Value- und Reference-Type

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
C# verfügt mit den Value- (alle numerischen Typen) und Reference-Typen (Klassen, String und Array) über zwei unterschiedliche Arten an Datentypen. Dieses Video zeigt die Unterschiede zwischen den beiden Typen.

Transkript

In diesem Abschnitt möchte ich mich dem Thema "Value Types Reference Types" widmen. Dieser Unterschied kommt von .NET her und wird in C# 1:1 abgebildet. Zunächst alle numerischen Typen in C#: Typen wie "Datetime" oder "Gewid" sind "Value Types"; "String", alle "Arrays" und alle "Klassen" sind "Reference Types". Jetzt möchte ich einen "Value Type" und einen "Reference Type" anlegen und Ihnen daran den Unterschied erklären. Einen "Reference Type" legt man in C# mit dem "Class-Schlüsselwort" an. Ich lege jetzt hier eine Klasse "ref." an, gebe dem Ganzen zwei Felder die hülle ich mit meinem Tool in "Properties" ein und jetzt bekommt das Ganze noch einen "Constructor". "public.ref.", damit ich es einfacher anlegen kann. Das ist also jetzt meine Klasse und insofern, weil alle Klassen Referenztypen sind, ist es eben auch ein gutes Beispiel für einen Referenztyp. Einen Value-Type kann ich in C# mit dem Schlüsselwort "Strukt" anlegen. Das Ganze muss jetzt einen anderen Namen bekommen; ich nenne es mal "ValPoint", und ansonsten lasse ich den ganzen Code unverändert. Praktisch die gleiche Sache, zumindest von der Semantik her, aber einmal als Referenztyp und einmal als Wertetyp deklariert. Jetzt kann ich Variablen anlegen davon. Das machen wir mal. Jetzt ist es so: Diese Variable hier ist eine Referenz auf eine Datenstruktur, die im sogenannten "Managed Heap" angelegt wird. Der "Managed Heap" ist ein großer Speicherbereich, aus dem für solche Referenzobjekte Speicher abgezwackt werden kann, und die Variable selbst hält dann diese Referenz auf diesen Speicherbereich. Während beim "Value Point" ist es so, dass die Variable direkt die Werte enthält. Also diese beiden "Integers", mit denen ich das Ganze initialisiert habe. Es gibt da keinen Verweis oder sonstwas eine Zuweisung, eine Variable kopiert in diesem Fall die Werte selbst, während eine Zuweisung einer Referenzvariable die Referenz kopiert. Den Unterschied möchte ich in der Praxis jetzt mal skizzieren. Dazu schreibe ich zwei Methoden, und in diesen Methoden versuche ich einmal, diese übergebenen Parameter zu manipulieren. Jetzt muss ich diese Methoden noch aufrufen, und jetzt kann ich auf der Console ausgeben, wie die Werte geworden sind. Es gibt also nacheinander die originalen Werte der Variablen hier aus. Dieses Ergebnis war jetzt einigermaßen zu erwarten. Beim Referenztyp war es der Methode möglich, die Variable zu manipulieren und beim Value-Type war es nicht möglich. Warum? Es wird der Aktualparameter zu dem Parameter der Methode kopiert. Im Fall des Referenztyps entsteht eine Kopie der Referenz. Diese Kopie zeigt auf das gleiche Objekt, also manipuliere ich das gleiche Objekt. Während bei dem Value Type werden die Werte kopiert und hier als Parameter übergeben. Jetzt kann ich in diese Kopie umeinander schreiben, soweit wie mir das möglich ist. Es wird das Original nicht ändern. Dieses Verhalten aber, dass diese Parameter eine Wertekopie erhalten. Dieses Verhalten lässt sich ändern, und zwar mit dem Schlüsselwort "Ref". Deswegen schreibe ich jetzt zwei neue Methoden. Das ist jetzt also die Werteübergabe bei "Value". Jetzt mache ich die Werteübergabe bei "Ref". Die mache ich, wie gesagt, mit diesem Schlüsselwort "Ref". Damit wir irgendeine Änderungen hier sehen können, nehme ich hier in dem Fall einmal zwei andere Werte, mit denen ich die Variablen manipuliere, damit wir auch genau sehen können, was passiert. Ich rufe diese beiden letzteren Methoden jetzt hier auf. Sie sehen, der Compiler, dem gefällt es ganz sicher noch nicht, weil nämlich bei einer Übergabe von Parametern als Referenz müssen wir hier auch im aufrufenden Kontext dieses "Ref"-Schlüsselwort angeben. Das hat eine Art dokumentarischen Charakter, dass im aufrufenden Kontext klar ist, dass sich der Wert dieser Variablen jetzt durch den Aufruf verändern kann. Ok, jetzt müssen wir das Ganze nur noch einmal ausgeben, und zwar "Reference Type by Value". Hier wird "by Reference" aufgerufen. Jetzt starte ich das Ganze mal. Und jetzt sieht man beim "Value-Type" den Unterschied. Vorher konnte ich ihn nicht manipulieren. Jetzt aber wird eine Referenz übergeben. Eigentlich tritt dadurch exakt der Fall ein, wie hier beim Referenztyp, der tritt jetzt hier beim "Value-Type" ein. Deswegen lässt sich diese Variable auch manipulieren. Jetzt möchte ich nochmal eine Kleinigkeit zeigen, dass nämlich dieser Aufruf bei "Value", dass der eine Kopie erzeugt und dass man tatsächlich das Original über die Kopie nicht manipulieren kann. Bei einem Referenztyp wäre nämlich der eigentliche Vergleich zu der Situation hier beim "Value-Type" der, wenn ich sage: "Ich erzeuge hier einen neuen "Ref-Point" und weise dem Parameter diesen "Ref-Point" zu. Das machen wir jetzt mal: "RP = New Ref.1 234". Da brauche ich jetzt natürlich so etwas hier. Etwas Ähnliches mache ich hier unten: "rp=newrefpoint", okay. Also der Unterschied ist, dass ich jetzt nicht die Variable manipuliere, sondern dass ich eine neue anlege und diesen Parameter hier zuweise. Sie ahnen wahrscheinlich schon, was passieren wird. Dieses "rp" hier ist eine Referenz, die per Kopie übergeben worden ist. Und ich überschreibe jetzt hier diese Kopie. Was dabei rauskommt ist, dass das Original unverändert bleibt. Während in diesem Fall, habe ich eine Referenz auf eine Referenz. Wenn ich jetzt über diese Referenz der Referenz eine neue Variable zuweise, dann ändert sich tatsächlich die originale Referenz. Und genau das kann man hier sehen. Ganz oben der "reference type" hat sich jetzt nicht geändert, weil die Zuweisung der neuen Variablen an die Kopie der Referenzen keine Veränderung verursacht. Aber hier, über die Referenz der Referenz, hier kriegen wir den Wert rüber. Ok, soweit zu den Referenz- und Value-Types in C#.

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!