myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Wieso verwendet C# ein separates Typsystem mit Wertetypen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wieso verwendet C# ein separates Typsystem mit Wertetypen?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
CWolle CWolle ist männlich
myCSharp.de-Mitglied

avatar-4065.jpg


Dabei seit: 22.02.2012
Beiträge: 53
Entwicklungsumgebung: Visual Studio 2017
Herkunft: Süddeutschland


CWolle ist offline

Wieso verwendet C# ein separates Typsystem mit Wertetypen?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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?
27.05.2020 09:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.033
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
27.05.2020 10:22 Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

avatar-4140.png


Dabei seit: 03.02.2012
Beiträge: 1.285
Entwicklungsumgebung: Visual Studio 2019
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
27.05.2020 10:29 Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.677
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

C#-Code:
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:

C#-Code:
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 27.05.2020 10:30.

27.05.2020 10:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

avatar-4140.png


Dabei seit: 03.02.2012
Beiträge: 1.285
Entwicklungsumgebung: Visual Studio 2019
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
27.05.2020 10:41 Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.568
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@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
27.05.2020 13:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Palladin007 Palladin007 ist männlich
myCSharp.de-Mitglied

avatar-4140.png


Dabei seit: 03.02.2012
Beiträge: 1.285
Entwicklungsumgebung: Visual Studio 2019
Herkunft: NRW


Palladin007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
27.05.2020 14:21 Beiträge des Benutzers | zu Buddylist hinzufügen
Coder007
myCSharp.de-Mitglied

Dabei seit: 05.08.2006
Beiträge: 1.209


Coder007 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
27.05.2020 20:13 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 2 Monate.
Der letzte Beitrag ist älter als 2 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 15.08.2020 04:08