Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wieso verwendet C# ein separates Typsystem mit Wertetypen?
CWolle
myCSharp.de - Member

Avatar #avatar-4065.jpg


Dabei seit:
Beiträge: 58
Herkunft: Süddeutschland

Themenstarter:

Wieso verwendet C# ein separates Typsystem mit Wertetypen?

beantworten | zitieren | melden

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#?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16232

beantworten | zitieren | melden

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
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1546
Herkunft: Düsseldorf

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4196

beantworten | zitieren | melden

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).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1546
Herkunft: Düsseldorf

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1920
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1546
Herkunft: Düsseldorf

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Coder007
myCSharp.de - Member



Dabei seit:
Beiträge: 1249

beantworten | zitieren | melden

Zitat von Palladin007
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.
private Nachricht | Beiträge des Benutzers