Definitionen von "primitiv", "Werttyp", "struct", "class", "wrap" in Java und C #

7

Ich habe versucht, die Verwendung von "Primitiven" in Java und C # und den Unterschied zwischen ihnen (falls vorhanden) zu verstehen. Ich habe eine Reihe von Fragen zu SO gestellt und einige der Antworten scheinen das Thema eher zu verwirren als zu klären. Einige Antworten (und einige MS-Dokumente) scheinen widersprüchliche Aussagen zu liefern. Von SO

und aus MS: Ссылка  - "Strukturen sind Klassen sehr ähnlich"  - "Die Klasse Int32 umschließt den Datentyp int "  - "Andererseits sind alle primitiven Datentypen in C # Objekte im System-Namespace. Für jeden Datentyp wird ein Kurzname oder Alias ​​angegeben. Zum Beispiel ist int der Kurzname für System.Int32" .

Meine Verwirrung liegt weitgehend bei C # (ich habe schon einige Zeit Java programmiert).

BEARBEITEN Der folgende Absatz wurde von @Jon Skeet als korrekt bestätigt

  • Java hat zwei Typen (Primitiv und Klasse). Die Wörter "Werttyp" könnten ein Synonym für primitiv (obwohl nicht weit verbreitet) und "Referenztyp" für Klasse sein. Java "umschließt" Primitive (int) in Klassen (Integer), und diese Klassen haben die volle Potenz einer anderen Klasse (sie können null sein, in Sammlungen verwendet werden usw.)

BEARBEITEN @Jon hat eine sehr klare Aussage zu C # gemacht, also werde ich meine vorgeschlagenen Wahrheiten löschen und auf seine Antwort verweisen.

Weitere Frage: Gibt es einen Konsens darüber, wie der tatsächliche Gebrauch dieser Begriffe aussehen sollte? Wenn es einen Konsens gibt, wäre ich sehr dankbar dafür, dass es ausdrücklich formuliert wird. Sonst nehme ich an, dass die Terminologie verworren ist und daher von begrenztem Nutzen ist.

ZUSAMMENFASSUNG Vielen Dank für die sehr klaren Antworten. Es gibt einen Konsens (siehe akzeptierte Antwort von @Jon) unter denen, die das wirklich verstehen und die MS-Dokumente konsistent sind (obwohl sie sich auf Java beziehen und ich diese für C # falsch interpretiere)

    
peter.murray.rust 21.10.2009, 09:05
quelle

2 Antworten

11

Der erste Aufzählungspunkt ist korrekt.

Das zweite ist nicht: die primitiven Typen in .NET sind Boolean , Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double und Single. Eine Struktur kann nicht normalerweise auf null gesetzt werden, aber es gibt auch nullbare Werttypen ( Nullable<T> ). Dies sind immer noch Werttypen, aber es gibt syntaktischen Zucker in C #, um "Null" mit "den Nullwert für den Typ" gleichzusetzen, was für einen Nullwerttyp eine Instanz ist, in der HasValue false zurückgibt.

int und System.Int32 sind exakte Synonyme in C #. Ersteres ist nur ein Alias ​​für Letzteres. Sie kompilieren zu genau denselben Code.

In C # sind Klassen und Schnittstellen immer Referenztypen. Structs und enums sind Werttypen - aber es gibt ein umrahmtes Äquivalent jeder Struktur (außer Nullable<T> , das von der CLR im Hinblick auf Boxen anders gehandhabt wird). Die Boxtypen haben keine separaten Namen und können nicht explizit in C # referenziert werden (obwohl sie in C ++ / CLI sein können). Es gibt keine separate Wrapper-Klasse, die äquivalent ist wie java.lang.Integer in .NET. Es wäre problematisch, solche Klassen einzuführen, da Sie anders als in Java eigene Werttypen in .NET erstellen können.

Weitere Informationen zu Referenztypen und Werttypen finden Sie in meinem Artikel .

    
Jon Skeet 21.10.2009, 09:14
quelle
12

Ich habe MS-Dokumente nicht als widersprüchlich empfunden (MSDN ist manchmal falsch, aber zu diesem speziellen Thema habe ich es immer richtig gesehen). Der von Ihnen gepostete MSDN-Link lautet:

  

Für jeden primitiven Datentyp in Java   Die Kernklassenbibliothek bietet a   Wrapperklasse, die es als a darstellt   Java-Objekt Zum Beispiel der Int32   Die Klasse umschließt den Datentyp int   Die doppelte Klasse umschließt die doppelten Daten   Geben Sie ein.

     

Auf der anderen Seite alle primitiven Daten   Typen in C # sind Objekte im System   Namensraum. Für jeden Datentyp ein kurzer   Name oder Alias ​​wird bereitgestellt. Zum   Beispiel, int ist der Kurzname für   System.Int32 und Double ist die Abkürzung   Form von System.Double.

Grundsätzlich sagt es das Richtige. In Java ist Integer class ein Wrapper für den primitiven Typ int . In C # ist int ein Alias ​​für System.Int32 structure. Der erste Abschnitt bezieht sich auf Java und gilt nicht für C #.

In .NET lautet die Terminologie wie folgt:

Ein primitiver Typ ist ein Typ mit IsPrimitive Eigenschaft wurde auf "True" festgelegt. Primitive Typen sind:

  

Die primitiven Typen sind Boolean, Byte,   SByte, Int16, UInt16, Int32, UInt32,   Int64, UInt64, IntPtr, UIntPtr, Zeichen,   Doppel und Single.

Alle primitiven Typen sind Werttypen, aber nicht umgekehrt .

Ein -Werttyp ist ein Typ, der eine Wertesemantik hat, im Gegensatz zur Referenzsemantik . Der gesamte Wert wird kopiert, wenn er nach Wert übergeben wird (nicht seine Referenz). Lokale Variablen von Werttypen werden im Stapel gespeichert. struct s und enum s sind Werttypen.

Wie oben erwähnt, sind alle primitiven Typen Werttypen. Sie sind struct s im Namensraum System . In C #, int , double usw. sind Schlüsselwörter im Grunde Aliasnamen für diese struct s.

    
Mehrdad Afshari 21.10.2009 09:09
quelle

Tags und Links