Ich habe eine Vergleich von C# und Java und der erste Punkt auf der Liste ist "Single-Root (unified) type system".
Können Sie beschreiben, was ein Single-Root (einheitliches) Typensystem bedeutet?
Ich habe eine Vergleich von C# und Java und der erste Punkt auf der Liste ist "Single-Root (unified) type system".
Können Sie beschreiben, was ein Single-Root (einheitliches) Typensystem bedeutet?
C# hat ein einheitliches Typsystem. Alle C#-Typen, einschließlich primitiver Typen wie int und double, erben von einer einzigen Wurzel object
Typ . Im Gegensatz zu Klassenobjekten sind diese primitiven Typen Werttypen. Sie werden nicht gesondert auf dem Heap alloziert und werden als Wert übergeben.
Wenn ein C#-Wert-Typ (z. B. ein primitiver int oder eine benutzerdefinierte Struktur) in eine parametrische Sammlung aufgenommen wird, wird er in einem dicht gepackten Array ohne Zeiger gespeichert. Dies ist möglich, weil C# eine benutzerdefinierte parametrische Instanziierung für jede unterschiedliche parametrische "Größe", die erforderlich ist, vornimmt. Das bedeutet, dass Sie bei der Instanziierung einer C# List<int>
speichert die zugrunde liegende Array-Liste dicht gepackte Arrays von int.
Fuente: http://www.pin5i.com/showtopic-24376.html
Java également hat mehrere primitive Typen (int, long, double, byte, usw.) - sie sind jedoch insofern besonders, als sie nicht objektorientiert und sie konnten nicht mit Hilfe der Sprache selbst definiert werden. Es handelt sich um Werttypen, die nicht dem Heap zugeordnet sind und als Wert übergeben werden.
Fuente: Vergleich von C# und Java - Einheitliches Typensystem (Wikipedia)
Zur gleichen Zeit, Java hat auch objektorientierte primitive "Wrapper"-Typen (Integer, Long, Double, Byte, usw.), oft genannt boxed
Typen. Dabei handelt es sich um auf dem Heap zugewiesene Objekte, die per Referenz übergeben werden und parallel zu den oben genannten primitiven Typen existieren.
In neueren Versionen von Java werden primitive Typen bei Bedarf automatisch in Objekttypen umgewandelt. Das entlastet die meisten von ihnen, kann aber auch subtile Fehler verursachen (siehe auch auto-boxing ).
Im Gegensatz zu C# verwaltet das integrierte JDK Collections Framework in Java immer Sammlungen von Objektzeigern. Um sie auf abwärtskompatible Weise parametrisch zu machen, wendet Java eine Technik namens "type-erasure" an, bei der (zur Laufzeit) alles innerhalb des Containers als Objekt behandelt wird (parametrisierte Typprüfungen werden zur Kompilierzeit durchgeführt).
Dies bedeutet, dass Sie keine Java List<int>
können Sie nur List<Integer>
. Und die obige Liste speichert tatsächlich ein Array von Zeigern auf boxed Integer
Objekte, die doppelt so groß und wesentlich weniger leistungsfähig ist als die C#-Version. Für die meisten Anwendungsfälle ist dieser Unterschied in Größe und Leistung irrelevant.
In Anwendungsfällen, in denen Größe und Leistung eine Rolle spielen, gibt es zwei Optionen:
int[]
. Arrays nativer Typen werden im Speicher gepackt, so dass sie VIEL weniger Speicher verbrauchen und leistungsfähiger sind.Das trifft auch auf C# nicht zu, denn nicht alle Typen leiten sich von Objekten ab, genau wie 99,9 % der Typen. Es gibt ein paar sehr seltsame Typen, die nicht in Objekte umgewandelt werden können. Der einzige offiziell unterstützte Typ ist der Zeiger. Es gibt 3 weitere nicht unterstützte Typen wie TypedReference, RuntimeArgumentHandle und einen dritten, dessen Name mir entfallen ist. Diese 3 Typen werden im Interop mit Methoden variabler Länge in C++/C verwendet. Ich würde mir keine allzu großen Sorgen um sie machen.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.