Строка примитивный тип?

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

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

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

9 ответов


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

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

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

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

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

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

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


нет определения" 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 namespace), способ определения экземпляров этого типа с помощью литерала; и разрешение использование этих типов в качестве констант; примитивные типы в VB.NET are:
    • 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# см. decimal как примитивный / простой тип, только VB.NET видит DateTime как что-то особенное, оба VB.NET и C# имеет псевдоним ключевого слова и литеральный синтаксис для строк, но только VB.NET указывает String как "примитивный тип", в то время как C# просто имеет раздел своей спецификации, посвященный System.String...

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

как System.String:

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

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

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 Еще одна статья в пользу ... --15-->MSDN Mag article

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


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

примитивных типов булево, байт, тип sbyte, типа INT16, типа uint16, int32 и тип uint32, типа int64, uint64 в тип char, Double и один.

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

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


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


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

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

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

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

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


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

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

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


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

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

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

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

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

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


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