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
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)
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 .
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.
Tags und Links java c# struct value-type primitive