Saltar al contenido

¿Es String un tipo primitivo?

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 – 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *