Определения "примитива", "типа значения", "структуры", "класса", "обертывания" в Java и C#


Я пытался понять использование "примитивов" в Java и C# и разницу между ними (если таковая имеется). Я задал ряд вопросов по этому вопросу, и некоторые ответы, похоже, скорее запутывают проблему, чем проясняют ее. Некоторые ответы (и некоторые документы MS), по-видимому, содержат противоречивые утверждения. От SO

И от МС: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80, легкий%29. aspx - "структуры очень похожи на классы" - "класс Int32 обертывает тип данных int " - "С другой стороны, все примитивные типы данных в C# являются объектами в пространстве имен System. Для каждого типа данных предоставляется краткое имя или псевдоним. Например, int - это краткое название System. Int32".

Моя путаница в основном связана с C# (я некоторое время программировал java).

EDIT следующий абзац был подтвержден @Jon Skeet

    Java имеет два типа (примитивный и класс). Слова "тип значения"могут быть синонимом для примитива (хотя и не широко используемого) и" ссылочного типа " для класса. Java "обертывает" примитивы (int) в классы (Integer), и эти классы имеют полную мощность любого другого класса (могут быть null, использоваться в коллекциях и т. д.)

EDIT @Jon дал очень четкое заявление на C# поэтому я удалю свои предложенные истины и сошлюсь на его ответ.

Следующий вопрос: существует ли консенсус относительно того, каким должно быть фактическое использование этих терминов? Если есть консенсус, я был бы очень признателен, если бы он был четко изложен. В противном случае я предполагаю, что терминология запутана и поэтому имеет ограниченное применение.

Резюме Спасибо за очень четкие ответы. Существует консенсус (см. принятый ответ от @Jon) среди тех, кто действительно понимает это, и MS docs непротиворечиво (хотя в некоторых местах они ссылаются на Java, и я неправильно истолковал их для C#)

2 7

2 ответа:

Первый пункт пули верен.

, второй нет: примитивов в .Чистая являются логическими, байт, тип sbyte, типа INT16, типа uint16, int32 и тип uint32, типа int64, uint64 в, тип IntPtr, UIntPtr, типа char, Double и один. Структура не может обычно быть установлена в null, но также существуют типы значений, допускающие обнуление (Nullable<T>). Это все еще типы значений, но есть синтаксический сахар в C#, чтобы приравнять " null "к" нулевому значению для типа", который для типа nullable value является экземпляром, где HasValue возвращает false.

int и еще System.Int32 являются точными синонимами в C#. Первое-это просто псевдоним для второго. Они компилируются в точно один и тот же код.

В C# классы и интерфейсы всегда являются ссылочными типами. Структуры и перечисления являются типами значений , но существует упакованный эквивалент каждой структуры (кроме Nullable<T>, который обрабатывается CLR по-разному в терминах упаковки). Коробочные типы не имеют отдельных имен и не могут быть явно упомянуты в C# (хотя они могут быть в C++ / CLI). В .NET нетотдельного класса-оболочки, эквивалентного java.lang.Integer; было бы проблематично вводить такие классы, поскольку вы можете создавать свои собственные типы значений в .NET, в отличие от Java.

Для получения дополнительной информации на ссылочные типы и типы значений, см. моя статья об этом.

Я не видел, чтобы MS docs противоречил этому (MSDN иногда ошибается, но в этом конкретном вопросе я всегда видел его правильным). Ссылка MSDN, которую вы разместили, гласит:

Для каждого примитивного типа данных в Java , библиотека основных классов предоставляет класс-оболочка, представляющий его в виде объект Java. Например, int32, что класс обертывает тип данных int, а Двойной класс обертывает двойные данные тип.

С другой стороны , все примитивные данные типы В C# - это объекты в системе пространство имен. Для каждого типа данных, короткий имя, или псевдоним, предоставляется. Для например, int-это краткое название для System. Int32 и double-это короткие форма системы.Двойной.

В принципе, он говорит правильные вещи. В Java класс Integer является оболочкой для примитивного типа int. В C# int - это псевдоним для структуры System.Int32. Первый абзац посвящен Java и не применяется к C#.


В .NET, терминология выглядит следующим образом:

A примитивный тип - это тип, который имеет IsPrimitive свойство установлено в true. Примитивными типами являются:

Примитивные типы являются булевыми, байтовыми, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Двухместный и одноместный.

Все примитивные типы являются типами значений, ноне наоборот .

A тип значения - это тип , имеющий семантику значения, как противопоставляется референтной семантике . Все значение копируется при передаче по значению (а не по ссылке на него). Локальные переменные типов значений хранятся в стеке. structs и enum s-типы значений.

Как уже упоминалось выше, все примитивные типы являются типами значений. Они являются structs в пространстве имен System. В С#, int, double, и т.д., ключевые слова в основном являются псевдонимами для тех structs.