Что такое единая система типов? - PullRequest
15 голосов
/ 20 ноября 2010

Я прочитал сравнение C # и Java , и первая вещь в списке - это "система с единым корнем (унифицированная) типа".

Можете ли вы описать, что такое- значит (унифицированный) тип системы означает?

Ответы [ 2 ]

29 голосов
/ 20 ноября 2010

C # имеет единую систему типов. Все типы C #, , включая примитивные типы, такие как int и double, наследуются от одного корня object type .В отличие от объектов класса, эти примитивные типы являются типами значений.Они не распределяются отдельно в куче и передаются по значению.

Когда тип значения C # (например, примитив int или определяемая пользователем структура) помещается в параметрическую коллекцию, он сохраняется в плотно упакованном массиве без указателей.Это возможно, потому что C # создает пользовательские параметрические экземпляры для каждого требуемого параметра.Это означает, что при создании экземпляра C # List<int> в базовом списке массивов хранятся плотно упакованные массивы типа int.

Источник: http://www.pin5i.com/showtopic-24376.html

Java также имеет несколько примитивных типов (int, long, double, byte и т. д.), однако они особенные в том, что они не объектно-ориентированы и не могли быть определены с использованием самого языка.Это типы значений, которые не выделяются в куче и передаются по значению.

Источник: Сравнение C # и Java - Система унифицированных типов (Википедия)

В то же время, Java также имеет объектно-ориентированные примитивные типы «обертки» (целочисленные, длинные, двойные, байтовые и т. Д.), Часто называемые boxed типами.Это распределенные объекты кучи, которые передаются по ссылке и существуют параллельно с упомянутыми выше примитивными типами.

В более поздних версиях Java примитивные типы автоматически упаковываются в типы объектов при необходимости.Это освобождает большую часть бремени управления ими, но также может вызывать незначительные ошибки (см. Также auto-boxing ).

В отличие от C #, в Java встроенные JDK-коллекцииFramework всегда управляет коллекциями указателей объектов.Чтобы сделать их параметрическими в обратно совместимом виде, Java выполняет технику, называемую стирание типа, при которой (во время выполнения) все обрабатывается как объект внутри контейнера (параметризованные проверки типов выполняются во время компиляции).

Это означает, что вы не можете сделать Java List<int>, вы можете сделать только List<Integer>.И в приведенном выше списке фактически хранится массив указателей на объекты Integer в штучной упаковке, который в два раза больше и существенно менее производительный, чем версия C #.Для большинства случаев использования это различие в размере и производительности не имеет значения.

В случаях использования, где размер и производительность важны, доступны две опции:

  1. Когда вы знаете размерв своем списке заранее используйте массив нативных типов, например int[].Массивы собственных типов упакованы в память, поэтому они потребляют ОЧЕНЬ МНОГО памяти и более производительны.
  2. Если вы заранее не знаете размер своего списка, используйте какую-либо реализацию списка сторонних производителей, которая переносит собственный массив, что позволяет добавлять элементы к нему после создания (некоторые примеры: Trove , Кольт , Fastutil , Гуава ).
12 голосов
/ 20 ноября 2010

Это на самом деле также не относится к C #, не все типы являются производными от объектов, как и 99,9% из них.Существует пара очень странных типов, которые нельзя превратить в объекты.Единственный официально поддерживаемый - указатели.Есть еще 3 неподдерживаемых, таких как TypedReference, RuntimeArgumentHandle и третий, имя которого ускользает от меня.Эти 3 типа используются с взаимодействием с методами переменной длины в C ++ / C.Я бы не беспокоился о них слишком сильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...