Te sugerimos que revises esta respuesta en un entorno controlado antes de enviarlo a producción, saludos.
Solución:
Ambos artículos dicen que string es NO un tipo primitivo. Que no es.
Si compila y ejecuta el código de ejemplo del segundo artículo, se imprimiría:
string no es un tipo primitivo.
Creo que la confusión sobre esto es que la sintaxis de la creación de un nuevo string es similar a crear tipos de valor.
Al definir un tipo de valor, todos estos son iguales (en un sistema de 32 bits de todos modos)
System.Int32 a = new System.Int32(5);
System.Int32 a = 5;
int a = 5;
Como estos al crear un tipo de referencia string:
System.String s = new System.String(new char[]'h', 'e', 'l', 'l', 'o');
System.String s = "hello";
string s = "hello";
También podemos comparar cadenas por valor aunque sean tipos de referencia:
s == "hello";//true
Esto todavía no hace string un tipo primitivo.
La respuesta aceptada a esta pregunta debería brindarle detalles al respecto.
No existe una definición de “Microsoft” de lo que es un tipo primitivo.
Solo hay definiciones de tipos primitivos en un contexto dado.
- El CLR define los tipos primitivos como nada más que:
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
- La versión 10 de la especificación VB.NET (en la sección 7.3) define “tipos primitivos” como tipos que tienen un alias de palabra clave para el tipo (permitiendo así el uso de ese tipo sin importar el
System
espacio de nombres), una forma de definir instancias de ese tipo con un literal; y permitir el uso de estos tipos como constantes; los tipos primitivos en VB.NET son: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
-
La especificación C # (versión 4) define los alias de palabras clave para algunos tipos y también define la forma de especificar literales para algunos valores; también define, por separado, qué tipos están disponibles en expresiones constantes; el concepto más cercano a “tipos primitivos” que tiene C # está en la sección 4.1.4: Tipos simples. (la palabra “primitivo” sólo se utiliza dos veces en el documento de 600 páginas); estos tipos primitivos se definen simplemente como “tipos de valor que tienen un alias de palabra clave en C #” –
string
no se menciona en esa sección: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
)
Verá que solo hay una superposición parcial entre todas estas cosas; el CLR ve ambos tipos de puntero como primitivos, tanto VB.NET como C # ven decimal como un tipo primitivo / simple, solo VB.NET ve DateTime como algo especial, tanto VB.NET como C # tienen un alias de palabra clave y una sintaxis literal para cadenas pero solo VB.NET especifica String
como un “tipo primitivo”, mientras que C # simplemente tiene una sección de su especificación dedicada a System.String
…
En conclusión: diferentes contextos tienen diferentes definiciones de lo que es un “tipo primitivo”. No importa, solo aprende a usar tu lenguaje de programación, no tiene sentido luchar y pensar en palabras tan polimórficas. Personalmente, me pregunto por qué la propiedad Type.IsPrimitive
incluso existe.
Como para System.String
:
- CLR: Nada especial, es solo un tipo de referencia;
- VB.NET: Es un tipo primitivo;
- C#:
String
es su propio copo de nieve muy especial;
Actualización de cambio de postura: no, ya que el código no miente
Console.WriteLine(typeof(string).IsPrimitive); => False
Console.WriteLine(typeof(int).IsPrimitive); => True
—– fin de actualización.
Pero alguna documentación en línea parece tratar a String como un elemento primitivo. creo sí – basado en la siguiente definición de “primitivo”. (Mi definición personal sería un tipo que no se puede dividir más en tipos de componentes. Pero supongo que solo estamos siendo ‘pedantes’ aquí, no es un problema para mí en su mayoría).
todos los tipos de datos primitivos en C # son objetos en el espacio de nombres del sistema. Para cada tipo de datos, se proporciona un nombre corto o alias.
Fuente: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx Otro artículo a favor – artículo de MSDN Mag
Resumen: supongo que la respuesta depende de tu definición de primitivo, que no se define de forma inequívoca. Fuente: Eric Lippert en otro hilo SO.
Al final de todo puedes encontrar las referencias de otros usuarios, tú de igual forma tienes la libertad de dejar el tuyo si te apetece.