Laden...

Wieso verwendet C# ein separates Typsystem mit Wertetypen?

Erstellt von CWolle vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.216 Views
CWolle Themenstarter:in
57 Beiträge seit 2012
vor 3 Jahren
Wieso verwendet C# ein separates Typsystem mit Wertetypen?

Wieso verwendet C# eigentlich ein separates Typsystem mit Wertetypen? Denn eigentlich lassen sich diese ja auch alle auf Klassen zurückführen und wären somit Referenztypen.
Sind Wertetypen nur eine lose Festlegung oder gibt es einen bestimmten Grund für die Deklaration?

OO gibts seit Platon - hatte der auch C#?

16.806 Beiträge seit 2008
vor 3 Jahren

Das Grundprinzip ist kein Alleinstellungsmerkmal von C# - das haben viele Sprachen e.g. Runtimes.

Prinzipiell _kannst _Du eine Sprache nur aus Reference Types umsetzen; Value Types machen das ganze jedoch in der Ausführung effizienter.

  • Reference Types zeigen auf die Lokation der Werte
  • Value Types zeigen direkt auf die Werte
2.078 Beiträge seit 2012
vor 3 Jahren

Ich finde bei dem Thema einen Artikel von Microsoft sehr aufschlussreich:

Auswählen zwischen Klasse und Struktur

Dort beschreiben sie auch, was die Unterschiede und die Auswirkungen davon sind.

Aber ja, im Grunde geht's eigentlich nur um Performance, aber es wäre fatal, zu glauben, man könne überall Structs nutzen, wenn man keine Klasse braucht.

4.931 Beiträge seit 2008
vor 3 Jahren

Ich glaube nicht, daß du für z.B. int generell einen Referenztyp haben möchtest:


void Test()
{
  int a= 1;
  Func(a);
  Console.WriteLine(a);
}

void Func(int x)
{
   x = 42;
}

Du möchtest doch sicherlich 1 als Ausgabe haben und nicht 42 (dafür gibt es ja extra das out-Schlüsselwort).
Oder noch einfacher:


int x = 1;
int y = 2;
x = y; // Zuweisung als Referenz?!
y += 40;
Console.WriteLine(x);

Ausgabe: 2 oder 42?!

Wertetypen werden direkt verarbeitet, während Referenztypen immer eine weitere Indirektion erfordern (d.h. auch der Laufzeit- und Speicheraufwand ist höher).

2.078 Beiträge seit 2012
vor 3 Jahren

Naja, angenommen, int wären Referenztypen, hätte sich die Arbeitsweise auch danach orientiert, dass man eben kein int so behandeln darf, wie Du es da getan hast.
In diesem fiktiven Szenario würden sich die Leute wahrscheinlich fragen, warum man das nicht als Referenztyp haben möchte 😉

Aber wenn man wissen will, wie es sich ohne Structs arbeitet: Java
Dort gibt es zwar auch int und Co., allerdings sind diese Typen nur sehr begrenzt und wer mehr damit machen möchte, muss ein Integer-Objekt daraus machen.
Jedes Mal, wenn ich mit Java arbeite (-n muss), wünsche ich mir wieder Structs und dass die vordefinierten Typen auf einen passenden Struct "gemappt" sind.

T
2.219 Beiträge seit 2008
vor 3 Jahren

@Palladin007
Das hat aber auch seine Gründe.
Zu Urzeiten von Java wollte man eben die Grunddatentypen nicht als Klassen haben sondern aus reinen Optimierungsgründen als "native" Typen.
Leider entsteht dadurch das Problem, dass man dann Wrapper Klassen und ihre Konvertierungsmethoden nutzen muss.

Dies hat C# m.M. durch die Wertetypen und Nullable sauberer gelöst, was auch den Syntaxs einfacher und verständlicher macht.
Ebenfalls kann ich dann z.B. einer Methode die ein int? erwartet einfach ein int geben.
In Java müsste ich dann erst den Wrapper Typen Integer ereugen um eine entsprechende Methode aufrufen zu können.
Ich finde es persönlich absolut häßlich in Java mit int und Integer sowie den anderen Wrappern arbeiten zu müssen.
Ich hätte mich gefreut, wenn Java den Syntax hier ähnlich wie C# durch eine saubere Lösung umbiegen könnte.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

2.078 Beiträge seit 2012
vor 3 Jahren

Ich weiß woher das kommt.
Daher ja überhaupt das Beispiel Java, weil man da schön sieht, wie es ist, komplett ohne Structs (naja, bis auf int und Co) zu arbeiten, während der Rest der Sprache viele Ähnlichkeiten zu C# hat.

Ich finde es aber auch irgendwo konsistent, Structs zu erlauben, wenn im Hintergrund sind die Compiler-Typen von Java auch nichts anderes, als bei C# (vermute ich zumindest), nur dass C# diese Funktionalität für die Entwickler zur Verfügung stellt.

C
1.214 Beiträge seit 2006
vor 3 Jahren

wenn im Hintergrund sind die Compiler-Typen von Java auch nichts anderes, als bei C# (vermute ich zumindest)

Nein... Ich bin hauptsächlich C++ Entwickler und ziemlich Performance-fixiert, habe aber auch ein größeres Java-Unterprojekt (wegen Lucene, ist aber sehr viel darauf aufgebaut). Und die fehlenden Wertetypen in Java sind ein Riesenproblem, da kann auch der "Compiler" nichts optimieren.