Zitat Zitat von RPG Hacker Beitrag anzeigen
Fakt ist aber, dass du sie nicht als Pointer verwendest. Das macht C# eben schon automatisch für dich. Für dich als Programmierer hingegen gibt es in C# in der Nutzung erstmal keinen Unterschied zwischen Reference-Typen und Value-Typen, die werden alle wie letzterer verwendet. Was ich damit sagen will: Wenn du beispielsweise eine Funktion mit Parametern schreibst, macht es für dich keinen Unterschied, ob du einen int übergibst oder eine Klasse. C# wählt automatisch die bestmögliche Option für dich. In C++ hingegen müsstest du selbst entscheiden, ob du die Klasse lieber als Daten oder als Referenz übergibst.
Doch, es gibt einen gravierenden Unterschied. Wertetypen werden im Stack alloziert und wird durch einen sog. Stack Pointer direkt vom Prozessor unterstützt.
Referenztypen hingegen werden im Heap alloziert. Das allozieren muss man explizit mit dem new-Schlüsselwort einleiten, ansonsten hat man hier einen Null-Pointer. Wertetypen hingegen können nicht null als Wert besitzen. Wer sowas braucht, der muss Wrapper-Klassen benutzen. Unter C# wäre dies z.B. int?. Das Fragezeichen deutet darauf hin, dass sich um eine Wrapper-Klasse von einem Wertetyp handelt.

Ein weiterer Unterschied ist der Pointer selbst:
Code:
int a = 5;
int b = a;
Hier haben wir zwei unabhängige Wertetypen, die jeweils den Wert 5 besitzen.
Code:
Circle cirlce1 = new Cirlce();
Circle circle2 = circle1;
Hier zeigen beide Referenztypen auf das selbe Objekt, und es ist auch egal, ob ich circle1 oder circle2 nehme.
Beide Code-Abschnitte machen im Prinzip das selbe, wir deklarieren zwei Variablen, eine Initialisieren wir und der zweiten übergeben wir dem Wert der ersten Variable, aber wir haben hier zwei unterschiedliche Ergebnisse.
Im ersten Beispiel übergeben wir den Wert und im zweiten Beispiel die Referenz.
Soll heißen: Nur weil man nicht explizit mit Pointern arbeitet, heißt es ja lange nicht, dass es keine Pointer mehr gibt, und der letzte zitierte Satz:

Zitat Zitat
In C++ hingegen müsstest du selbst entscheiden, ob du die Klasse lieber als Daten oder als Referenz übergibst.
Zeigt, dass du die Pointer nicht so ganz verstanden hast, denn das tust du unter C# auch. Nur ist die Syntax in C# nicht ganz so kryptisch, wie bei C/C++.
Auch bei C# musst du entscheiden, ob du einen Werteparameter (Call-by-Value), oder einen Referenzparameter (Call-by-Reference) an eine Methode übergeben möchtest.