2010-10-19 5 views
52

Мне любопытно узнать о строковых и примитивных типах. Статья вроде this говорит, что строка является примитивным типом. Однако second article в MSDN не перечисляет строку как примитивный тип.Является ли String примитивным типом?

Однако, когда я запустил код, указанный во второй статье, он отображает Строка не является примитивным типом.

Может ли кто-нибудь навестить меня на этом?

+4

Вы всегда можете попробовать образец кода второй статьи и открыть для себя. – Kyte

+0

Я пробовал код, он показывает, что String не является примитивным типом – Ram

+9

@kyte: я считаю, что OP хотел получить некоторые комментарии о том, что две официальные страницы Microsoft на MSDN имеют разные мнения о том, является ли строка примитивным типом. Говорить ему использовать только один из источников не очень полезно без действительных аргументов –

ответ

34

Обе статьи говорят, что строка NOT примитивный тип. Что это не так.

Если скомпилировать и запустить пример кода из второй части статьи было бы напечатать:

строка не является примитивным типом.

Я думаю, что путаница в том, что синтаксис создания новой строки похож на создание типов значений.

При определении типа значения все они равны (на 32 битной системе в любом случае)

System.Int32 a = new System.Int32(5); 
System.Int32 a = 5; 
int a = 5; 

Так же, как они при создании строки ссылочного типа:

System.String s = new System.String(new char[]{'h', 'e', 'l', 'l', 'o'}); 
System.String s = "hello"; 
string s = "hello"; 

Кроме того, мы можем сравнить хотя они являются ссылочными типами:

s == "hello";//true 

Это все еще не делает st кольцо примитивного типа.

Принятый ответ на этот вопрос question должен предоставить вам подробную информацию об этом.

+4

Если вы видите первую статью, это говорит о Visual Basic.NET определяет следующие примитивные типы: в которых перечислены: Тип ссылки String, который представляет последовательность символов Юникода и карты в System.String. Значение по умолчанию для типа String является пустой ссылкой. – Ram

+0

@Ram - но вы отметили этот вопрос C# ... есть много мест, где VB использует несколько разные интерпретации. (уточнение, тег [vb.net] был добавлен позже) –

+0

@ Marc - Спасибо, что указали это. Я включил тег VB.NET. Я просто хочу знать, есть ли разница между примитивными типами C# и VB.NET. – Ram

5

.NET определяет (из Вашей статьи):

Примитивные типы Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Char, распашные и Single.

Так что нет. Встроенный и очень важный: да, но не примитив.

VB использует несколько иное определение для CLI и C#.

+0

IntPtr также является примитивным типом – Esperadoce

+0

@Esperadoce согласен, но я цитировал связанную статью OP –

9

Переключение из-позиции Update: Нет, так как код не лжет

Console.WriteLine(typeof(string).IsPrimitive); => False 
Console.WriteLine(typeof(int).IsPrimitive); => True 

----- конец обновления.
Но какая-то документация в Интернете, похоже, относится к String как к примитиву. Я думаю, Да - на основе следующего определения «примитив». (Мое личное определение было бы типом, который не может быть разбит далее на типы компонентов. Но я думаю, что мы просто «педантичны» здесь, это не проблема для меня в основном.)

все примитивными типами данных в C# являются объекты в пространстве имен System.Для предоставляется каждый тип данных, краткое имя или .

Источник: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx Другая статья в пользу - MSDN Mag article

Резюме: Я думаю, что ответ зависит от вашего определения примитива, который однозначно не определен. Eric Lippert on another SO thread.

+0

По вашему определению, я думаю, только один бит примитивен? ;-) (Int32 - это не более 4 байт, сложенных вместе, например) –

+1

, это определение не означает, что все типы в пространстве имен 'System' являются примитивами (я могу добавлять типы в пространство имен System System в моей сборке, поэтому они будут примитивы?), он просто утверждает, что все существующие примитивные типы можно найти в «Системе» и нигде больше. – max

+0

@Isak - вы можете принять все рекомендации до крайности :) Получение 3-го байта из Int не имеет индивидуального/специального использования в большинстве случаев. Получение FirstName из сложенного типа адреса. Таким образом, Int был бы примитивным для меня .. адрес не будет. – Gishu

1

Нет, строка не является примитивным типом.

Однако он имеет некоторые характеристики, общие с примитивными типами.

Язык поддерживает строковые литералы в коде, так что вам не нужно явно создавать экземпляры String с использованием ключевого слова new, чтобы получить строковый объект.

Существует также поддержка конкатенации строк с помощью оператора +, который компилятор превращает в вызов метода String.Concat.

Строки неизменяемы, а это означает, что в большинстве ситуаций она имеет семантику типа значения, как и примитивные типы.

+0

так почему же он не примитивен? Я имею в виду, что характерно для этого, а не для других примитивных типов? –

+0

@ Исак Саво: Что значит? – Guffa

+0

Я имею в виду, что вы говорите, что это не примитивно, а затем перечисляет материал, который может утверждать, что его следует называть примитивным. Вы никогда не говорили о том, почему он * не является примитивным типом. (Я искренне заинтересован, и я не тот, кто занижен) –

0

String - особый примитивный тип. Это не тип значения, но может считаться примитивным типом, потому что он может быть создан путем написания литералов, например/«привет», и можно объявить константу строки типа. Сказав, что значение IsPrimitive возвращает ложное

Console.WriteLine("hello".GetType().IsPrimitive) // output = False 

EDIT: Я хочу, чтобы забрать мой ответ здесь. Это технически не примитивный тип, но разделяет свойства, указанные выше.

+0

Я бы предположил, что полезное определение примитивного типа должно включать в себя вещи, которые, если они явно не обрабатываются компиляторами и средой выполнения, не могут быть эффективно эмулированы в коде пользователя. По этому определению строки и массивы будут примитивными типами, поскольку они имеют специальную обработку, которая отличается от всего, что может сделать пользовательский код. – supercat

0

В C# типы в основном определяются как два типа: типы значений и примитивные типы.

Сперва см. definition примитивных типов в C#.

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

Теперь, прочитайте эту статью разницу: Primitive Types & Value Types

System.String карты на "string", который является примитивным типом в CLI. Но в реальности типы значений - это те, которые идут в стеке, а не в куче.

Таким образом, ключ Типы значений vs Примитивные типы. По определению примитива Microsoft, это примитивный тип, но в более общем смысле его нет.

+1

Типы значений и _primitive types_? Возможно, вы имели в виду типы ссылок? –

-1

они не являются, потому что они являются последовательность символов

+2

вам нужно немного увеличить свой ответ, чтобы он мог быть ценным. – JMax

3

Под определение Microsoft о «примитивной», строка не считается примитивного типа. С другой стороны, Microsoft имеет тенденцию использовать терминологию, не создавая четкого или последовательного определения (например, «неуправляемый ресурс»), и можно было бы с пользой определить «примитивный», чтобы включить «String», «Array» и «Object», поскольку в их отсутствие не было бы способа определить типы, которые могли бы ими эффективно имитировать.

+0

Хороший ответ. VB.NET считает, что 'DateTime' также является примитивным, что в некоторой степени соответствует мне. – nawfal

35

Не существует определения «Microsoft» того, что такое примитивный тип.

В данном контексте существуют только определения примитивных типов.

  • The CLR определяет примитивные типы, как будучи не более чем:
    • System.Boolean
    • System.Byte
    • System.SByte
    • System.Int16
    • System.UInt16
    • System.Int32
    • System.UInt32
    • System.Int64
    • System.UInt64
    • System.IntPtr
    • System.UIntPtr
    • System.Char
    • System.Double
    • System.Single
  • Спецификация VB.NET версии 10 (в разделе 7.3) определяет «примитивные типы» как типы, у которых есть псевдоним ключевого слова для типа (таким образом, использование этого типа без импорта пространства имен System), способ определения экземпляры этого типа с литералом; и разрешая использование этих типов в качестве констант; примитивные типы в VB.NET являются:
    • System.Byte
    • System.SByte
    • System.UInt16 (UShort)
    • System.Int16 (Short)
    • System.UInt32 (UInteger)
    • System.Int32 (Integer)
    • System.UInt64 (ULong)
    • System.Int64 (Long)
    • System.Single
    • System.Double
    • System.Decimal
    • System.Boolean
    • System.DateTime (Date)
    • System.Char
    • System.String
  • Спецификация C# (версия 4) определяет псевдонимы псевдонимов для некоторых типов, а также определяет способ указания литералов для некоторых значений; он также определяет отдельно, какие типы доступны в постоянных выражениях; самая близкая концепция к «примитивным типам», которую имеет C#, приведена в разделе 4.1.4: Простые типы.(слово «примитив» используется только дважды в документе на 600 страниц); эти примитивные типы просто определяется как "типы значений, которые имеют псевдоним ключевое слово в C#" - string не упоминается в этом разделе:

    • System.SByte (sbyte)
    • System.Byte (byte)
    • System.Int16 (short)
    • System.UInt16 (ushort)
    • System.Int32 (int)
    • System.UInt32 (uint)
    • System.Int64 (long)
    • System.UInt64 (ulong)
    • System.Char (char)
    • System.Single (float)
    • System.Double (double)
    • System.Boolean (bool)
    • System.Decimal (decimal)

Вы увидите, что есть только частичное перекрытие между всеми этими вещами; CLR рассматривает оба типа указателей как примитивные, как VB.NET, так и C#, как десятичный, как примитивный/простой тип, только VB.NET видит DateTime как что-то особенное, как VB.NET, так и C# имеют псевдоним ключевого слова и литеральный синтаксис для строк но только VB.NET определяет String как быть «примитивным типом», в то время как C# просто есть раздел своей спецификации посвященного System.String ...

в заключении: различные контексты имеют разные определения, что такой «примитивный тип» является , Не имеет значения - просто научитесь использовать свой язык программирования, нет смысла бороться и думать над такими полиморфными словами. Лично мне интересно, почему свойство Type.IsPrimitive существует.

Что касается System.String:

  • CLR: Ничего особенного, это просто тип ссылки;
  • VB.NET: Это примитивный тип;
  • C#: String - это особая снежинка;
+1

К CLR, я не думаю, что 'String' является« просто другим ссылочным типом ». Строки и массивы - это единственные объекты, размер которых не подразумевается их типами. Кроме того, я считаю, что строка является единственным типом типа, для которого время выполнения при загрузке сборки автоматически генерирует экземпляры, содержащие данные, хранящиеся в этой сборке. – supercat

+0

_ "типы значений, которые имеют псевдоним ключевого слова в C#" - строка не упоминается в этом разделе_. Ну, строка - ссылочный тип в конце концов. –

+0

Я пытаюсь понять последствия различий «IsPrimitive» между CLR, VB.NET и C#. Например, если я пишу код в C#, содержащий условие, основанное на объекте, являющемся примитивным типом, и мой модульный тест утверждает, что он работает как ожидается для DateTime (который C# считает не примитивным). Затем я компилирую DLL, на которую ссылается разработчик с использованием VB.NET (который считает, что DateTime является примитивным), будет ли поведение моей DLL другим (другими словами, мой модульный тест является только достойным в контексте C#, который бесполезен)? – Matt

Смежные вопросы