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



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



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



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

704   9  

9 ответов:

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

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

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

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

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

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

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

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

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

.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-это короткое имя System. Int32 и двойной короткий форма системы.Двойной.

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

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

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

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

Comments

    Ничего не найдено.