Подтвердить что ты не робот

Является ли String примитивным типом?

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

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

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

4b9b3361

Ответ 1

Обе статьи говорят, что строка 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

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

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

Ответ 2

Нет определения "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
  • Спецификация С# (версия 4) определяет псевдонимы ключевых слов для некоторых типов, а также определяет способ указания литералов для некоторых значений; он также определяет отдельно, какие типы доступны в постоянных выражениях; самая близкая концепция к "примитивным типам", которую имеет С#, приведена в разделе 4.1.4: Простые типы. (слово "примитив" используется только дважды в документе на 600 страниц); эти примитивные типы просто определяются как "типы значений, которые имеют псевдоним ключевого слова в С#" - 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, так и С#, как десятичный, как примитивный/простой тип, только VB.NET видит DateTime как что-то особенное, как VB.NET, так и С# имеют псевдоним ключевого слова и литеральный синтаксис для строк но только VB.NET указывает string как "примитивный тип", а С# просто имеет раздел своей спецификации, посвященный System.String...

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

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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

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

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

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

Ответ 9

они не являются, поскольку они представляют собой последовательность символов