Определения "примитива", "типа значения", "структуры", "класса", "обертывания" в 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".
EDIT следующий абзац был подтвержден @Jon Skeet
- Java имеет два типа (примитивный и класс). Слова "тип значения"могут быть синонимом для примитива (хотя и не широко используемого) и" ссылочного типа " для класса. Java "обертывает" примитивы (int) в классы (Integer), и эти классы имеют полную мощность любого другого класса (могут быть null, использоваться в коллекциях и т. д.)
EDIT @Jon дал очень четкое заявление на C# поэтому я удалю свои предложенные истины и сошлюсь на его ответ.
Следующий вопрос: существует ли консенсус относительно того, каким должно быть фактическое использование этих терминов? Если есть консенсус, я был бы очень признателен, если бы он был четко изложен. В противном случае я предполагаю, что терминология запутана и поэтому имеет ограниченное применение.
Резюме Спасибо за очень четкие ответы. Существует консенсус (см. принятый ответ от @Jon) среди тех, кто действительно понимает это, и MS docs непротиворечиво (хотя в некоторых местах они ссылаются на Java, и я неправильно истолковал их для C#)
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 тип значения - это тип , имеющий семантику значения, как противопоставляется референтной семантике . Все значение копируется при передаче по значению (а не по ссылке на него). Локальные переменные типов значений хранятся в стеке.
Как уже упоминалось выше, все примитивные типы являются типами значений. Они являютсяstruct
s иenum
s-типы значений.struct
s в пространстве именSystem
. В С#,int
,double
, и т.д., ключевые слова в основном являются псевдонимами для техstruct
s.