Является ли String примитивным типом? - PullRequest
63 голосов
/ 19 октября 2010

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

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

Может ли кто-нибудь помочь мне в этом?

Ответы [ 9 ]

44 голосов
/ 19 октября 2010

В обеих статьях говорится, что строка НЕ является примитивным типом.А это не так.

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

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

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

При определении типа значения все они равны (в любом случае, в 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

Это все еще не делает строку примитивным типом.

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

42 голосов
/ 23 ноября 2012

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

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

  • 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 - это собственная особая снежинка;
10 голосов
/ 19 октября 2010

Обновление изменения позиции: Нет, так как код не лжет

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

Резюме: я полагаю, что ответ зависит от вашего определения примитива, которое однозначно не определено .Источник: Эрик Липперт из другого SO потока.

6 голосов
/ 19 октября 2010

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

Типы примитивов: логические, байтовые, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Char, Double и Single.

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

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

3 голосов
/ 28 июня 2012

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

3 голосов
/ 19 октября 2010

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

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

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

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

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

1 голос
/ 19 октября 2010

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

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

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

Теперь прочитайте эту статью, чтобы узнать разницу: Примитивные типы и типы значений

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

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

1 голос
/ 19 октября 2010

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

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

РЕДАКТИРОВАТЬ: Я хочу забрать свой ответ здесь. Технически это не примитивный тип, но он обладает свойствами, которые я изложил выше.

0 голосов
/ 17 ноября 2011

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

...