Frage

Ich bin manuell konvertieren von code von Java zu C# und kämpfen mit den (wie ich Sie nenne) primitive Typen (siehe, z.B. Tun autoboxing und unboxing Verhalten sich anders in Java und C#).Aus den Antworten, die ich verstehen, dass double (C#) und Double (C#) gleichwertig sind und double (C#) können auch verwendet werden in Behältern, z.B.als Schlüssel in einem Wörterbuch.Jedoch, double (Java) kann nicht verwendet werden in die Container wie HashMap, die ist, warum es ist die auto-Box zu Double (Java).

  1. Ist double (C#) eine primitive oder ein Objekt?
  2. Wenn es ist eine primitive, was macht es anders Verhalten aus double (Java)?

double (C#) nicht auf null gesetzt werden, es sei denn, es ist aus nullable.

  1. Ist double? (C#) entspricht Double (Java)?Sind Sie beide als "Objekte" bezeichnet?

(Ist der Begriff "first-class-Objekt" sinnvoll, in diese Diskussion?)

War es hilfreich?

Lösung

Beide C# und Java haben primitive (oder "Wert") Datentypen:int, double, float, etc...

Jedoch, nach dieser C# - und Java-neigen dazu, sich zu teilen.

Java-wrapper-Klasse-Typen für alle primitiven Typen (das ist eine kleine endliche Menge in Java), die ermöglicht Sie zu behandeln, als Objekt.double/Double, int/Integer, bool/Boolean, etc.Diese wrapper-Typen sind Referenz-Typen (Lesen Sie:Klassen) und, als solche, null ein Gültiger Wert zuzuweisen, um eine solche typisierte Ausdrücke/Variablen.Neuere Versionen von Java (1.5/5+) fügen Sie im impliziten Zwang von primitiven zu Ihren entsprechenden wrapper.

// Java
Boolean b = true; // implicit conversion boolean -> Boolean (Java 5+)
Boolean b = null; // okay, can assign null to a reference type
boolean n = null; // WRONG - null is not a boolean!

C# nicht, eine solche direkte Verpackung1 - in Teil, weil C# unterstützt unendliche Menge von Wert-Typen über Strukturen;lieber, C# handles", nullable value types" durch die Einführung eines Nullable<T> wrapper-Typ.Neben C#, wie Java, hat die implizite Konvertierung vom Wert geben T zu Nullable<T>, mit der Einschränkung , dass T nicht "zu einem nullable-Typ" selbst.

// C#
Nullable<bool> b = true; // implicit conversion bool -> bool?
bool? b = true;          // short type syntax, implicit conversion
bool? b = null;          // okay, can assign null as a Nullable-type
bool b = null;           // WRONG - null is not a bool

Beachten Sie, dass Nullable<T> auch einen Wert geben, und so folgt die standard-Struktur-Regeln, wenn/wenn ein Wert "auf dem stack" oder nicht.

In Reaktion auf den Kommentar:

Absolut richtig, Nullable ein Wert-Typ nicht erlauben, es zu haben eine mehr kompakte Speicher-footprint in bestimmten Fällen als es vermeiden können, den Speicherbedarf einer Referenz-Typ: Was ist der Speicherbedarf von einem Nullable -<T>.Aber noch mehr Speicher benötigt, als die nicht-Nullable-Typ, weil es zu merken, wenn die Wert ist null, oder nicht.Je nach Ausrichtung der Themen-und VM-Implementierung, dies kann oder kann nicht sein, deutlich weniger als einen "vollständigen" - Objekt.Auch, weil die Werte in C#/CLR sind vergegenständlicht betrachten lifting-Operationen, die durchgeführt werden müssen:

// C#
object x = null;
x = (bool?)true;
(x as bool?).Value // true

Der Artikel Java-Spitze 130:Tun Sie wissen, dass Ihre Daten Größe? Gespräche über den Typ der Referenz Speicherverbrauch (in Java).Eine Sache zu beachten ist, dass die JVM hat spezialisierte Versionen von Arrays intern, eine für jeden primitiven Typ und für Objekte (jedoch, beachten Sie bitte, dass dieser Artikel enthält einige irreführende Angaben).Beachten Sie, wie die Objekte (vs.primitive) entstehen zusätzliche Speicher-overhead und die byte-Ausrichtung Probleme.C# jedoch können verlängern die optimierte array Fall für Nullable<T> Typen vs.die die limitierte special-Fällen die JVM hat, weil Nullable<T> ist selbst nur eine Struktur geben (oder "primitive").

Jedoch, ein Objekt, nur erfordert eine kleine Feste Größe zu erhalten eine "Referenz", um es in eine variable slot.Eine variable, slot type Nullable<LargeStruct> auf der anderen Seite muss Platz haben für LargeStruct+Nullable (der Steckplatz kann sich auf dem heap).Finden C# - Konzepte:Wert vs Referenz-Typen.Beachten Sie, wie in der "lifting" - Beispiel oben die variable ist vom Typ object: object ist die "root-Typ in C# (Eltern der beiden Referenztypen und Werttypen) und nicht eine spezialisierte Wert geben.


1 Die C# - Sprache unterstützt einen festen Satz von aliases für primitive/common Typen, die den Zugang zu "freundlich " Kleinbuchstaben" - Typ-Namen.Für Beispiel, double ist ein alias für System.Double und int ist ein alias für System.Int32.Es sei denn, eine andere Double geben Sie importiert wird, im Rahmen, double und Double beziehen sich auf die gleiche Art in C#.Ich empfehle die Verwendung der Aliase, es sei denn, es gibt einen Grund, etwas anderes zu tun.

Andere Tipps

Nullable<double> (aka double?) in C # ist nicht das gleiche wie ein Double in Java.

Vor Java Autoboxing / Unboxing hatte, musste man manuell zwischen Primitiven konvertieren und First-Class-Objekte:

Double dblObj = new Double(2.0);
double dblPrim = dblObj.doubleValue();

In Java 1.5, die sich geändert, so könnte man einfach tun:

Double dblObj = 2.0;
double dblPrim = dblObj;

Und Java würde Code einfügen automatisch das obige Beispiel spiegeln.

C # ist anders, weil es eine unbegrenzte Anzahl von „primitivem“ Typ ist (was die CLR Anrufe Werttypen ). Diese verhalten sich meist wie Java Primitiven, mit Wert Semantik . Sie können neue Werttypen mit dem struct Schlüsselwort erstellen. C # hat Autoboxing / Unboxing für alle Werttypen und macht auch alle Werttypen von Object ableiten.

So können Sie einen Werttyp (wie double) verwenden können, wo Sie jeden Objektverweis (beispielsweise wie ein Schlüssel in einem Dictionary) verwenden würden, und es wird bei Bedarf wird verpackt, sonst verwendet nur direkt. (C # 's Generics Umsetzung ist gut genug, um zu vermeiden Boxen in den meisten Fällen).

In C #, der beste Weg, um separate Objekte sind durch "Wertetypen", die ein bisschen wie Primitive sind - ints, bools, etc. und "Referenztypen." - Klassen etc

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top