19 Stimmen

Was ist ein einheitliches Typensystem?

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?

34voto

Neeme Praks Punkte 8450

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:

  1. Wenn Sie die Größe Ihrer Liste im Voraus kennen, verwenden Sie ein Array nativer Typen, zum Beispiel int[] . Arrays nativer Typen werden im Speicher gepackt, so dass sie VIEL weniger Speicher verbrauchen und leistungsfähiger sind.
  2. Wenn Sie die Größe Ihrer Liste nicht im Voraus kennen, verwenden Sie eine Listenimplementierung eines Drittanbieters, die das systemeigene Array umhüllt und es ermöglicht, nach der Erstellung Elemente hinzuzufügen (einige Beispiele: Trove , Colt , Fastutil , Guave ).

12voto

Michael B Punkte 7412

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.com

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.

Powered by:

X