2010-10-19 35 views
52

Tengo curiosidad sobre la cuerda y los tipos primitivos. Artículo como this dice que la cadena es de tipo primitivo. Sin embargo, second article en MSDN no muestra la cadena como tipo primitivo.¿Es String un tipo primitivo?

Sin embargo, cuando ejecuté el código proporcionado en el segundo artículo, muestra Cadena no es primitiva tipo.

¿Alguien me puede guiar en esto?

+4

Siempre puedes probar el ejemplo del código del segundo artículo y descubrirlo por ti mismo. – Kyte

+0

Probé el código, muestra String no es el tipo primitivo – Ram

+9

@kyte: creo que el OP quería algunos comentarios sobre el hecho de que dos páginas oficiales de Microsoft en MSDN tienen opiniones diferentes sobre si la cadena es un tipo primitivo. Decirle que use solo una de las fuentes no es muy útil sin argumentos válidos –

Respuesta

34

Ambos artículos dicen que la cadena es NOT un tipo primitivo. Lo cual no es

Si compilar y ejecutar el código de ejemplo del segundo artículo se imprimiría:

cadena no es un tipo primitivo.

Creo que la confusión sobre esto es que la sintaxis de la creación de una nueva cadena es similar a la creación de tipos de valores.

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; 

Al igual que éstos, cuando la creación de una cadena de tipo de referencia:

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 a pesar de que son tipos de referencia:

s == "hello";//true 

Esto todavía no lo hace suena un tipo primitivo.

La respuesta aceptada a este question debería darle detalles sobre eso.

+4

Si ve el primer artículo, dice Visual Basic.NET define los siguientes tipos primitivos: que enumera: El tipo de referencia de cadena, que representa una secuencia de caracteres Unicode y asigna a System.String. El valor predeterminado del tipo String es una referencia nula. – Ram

+0

@Ram - sin embargo, has etiquetado esta pregunta C# ... hay muchos lugares donde VB utiliza interpretaciones ligeramente diferentes. (aclaración: la etiqueta [vb.net] se agregó más tarde) –

+0

@ Marc - Gracias por señalarlo. Incluí la etiqueta VB.NET. Solo quiero saber si hay alguna diferencia entre los tipos primitivos C# y VB.NET. – Ram

5

define .NET (de su artículo):

Los tipos primitivos son Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Char, doble y simple.

Así que no. Incrustado y muy importante: sí, pero no es un primitivo.

VB utiliza una definición ligeramente diferente a la CLI y C# parece.

+0

IntPtr es también un tipo primitivo – Esperadoce

+0

@Esperadoce estuvo de acuerdo, pero estaba citando el artículo vinculado de OP –

9

actualización de cambio de postura: No ya que el código no reside

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

final ----- de actualización.
Pero parte de la documentación en línea parece tratar a String como una primitiva. Creo que - según 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 estamos siendo 'pedantes' aquí, no es un problema para mí en su mayoría).

all los tipos de datos primitivos en C# son objetos en el espacio de nombres del sistema.Para se proporciona cada tipo de datos, un nombre corto o alias .

Fuente: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx Otro artículo a favor - MSDN Mag article

Resumen: supongo que la respuesta depende de su definición de primitiva, que no está definido de forma inequívoca. Fuente: Eric Lippert on another SO thread.

+0

¿Según su definición, supongo que solo el único bit es primitivo? ;-) (Int32 no es más que 4 bytes apilados, por ejemplo) –

+1

esa definición no significa que todos los tipos en el espacio de nombres 'System' sean primitivos (puedo agregar tipos al espacio de nombres' System' en mi ensamblado, entonces lo harán ser primitivos?), simplemente establece que todos los tipos primitivos existentes se pueden encontrar en 'Sistema' y en ningún otro lugar. – max

+0

@Isak: puede llevar cualquier directriz al extremo :) Obtener el 3er byte de un Int no tiene un uso individual/específico en la mayoría de los casos. Obtener el primer nombre de un tipo de dirección compuesta sí lo hace. Entonces el Int sería un primitivo para mí ... la dirección no. – Gishu

1

No, la cadena no es un tipo primitivo.

Sin embargo, tiene algunas características comunes con los tipos primitivos.

El lenguaje admite literales de cadena en el código, por lo que no tiene que crear explícitamente instancias String utilizando la palabra clave new para obtener un objeto de cadena.

También hay soporte para concatenar cadenas utilizando el operador +, que el compilador convierte en una llamada al método String.Concat.

Las cadenas son inmutables, lo que significa que en la mayoría de las situaciones tiene una semántica de tipo de valor, al igual que los tipos primitivos.

+0

Entonces, ¿por qué no es primitivo? Quiero decir, ¿qué característica tiene * no * que tengan otros tipos primitivos? –

+0

@Isak Savo: ¿Qué quieres decir? – Guffa

+0

Quiero decir que dices que no es primitivo, pero luego enumera cosas que podrían argumentar que debería llamarse primitivo ... Nunca mencionaste por qué * no es * un tipo primitivo. (Estoy sinceramente interesado, y no soy el que votó negativamente) –

0

Cadena es un tipo primitivo especial. No es un tipo de valor, pero se puede considerar como un tipo primitivo porque puede crearse escribiendo literales, por ejemplo/"hola" y es posible declarar una constante de tipo cadena. Una vez dicho esto, el valor de IsPrimitive devuelve falso

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

EDIT: Quiero recuperar mi respuesta aquí. Técnicamente no es un tipo primitivo, pero comparte las propiedades que mencioné anteriormente.

+0

Sugeriría que una definición útil de tipo primitivo incluye cosas que, si no se manejan explícitamente por los compiladores y el tiempo de ejecución, no podrían ser emulados de manera eficiente en el código de usuario. Según esa definición, las cadenas y matrices serían tipos primitivos ya que tienen un manejo especial que no se parece a nada que el código de usuario pueda hacer. – supercat

0

En C# los tipos se definen principalmente como dos tipos: tipos de valores y tipos primitivos.

Primero, vea el definition de tipos primitivos en C#.

Por otra parte, todos los datos primitivos tipos en C# son los objetos en el espacio de nombres System . Para cada tipo de datos, se proporciona un nombre corto o alias. Para la instancia , int es el nombre abreviado de System.Int32 y el doble es el formato corto de System.Double.

Ahora, lea este artículo para la diferencia: Primitive Types & Value Types

System.String mapas para "string", que es un tipo primitivo de la CLI. Pero en la realidad, los tipos de valores son los que van en la pila y no en el espacio de montón.

Por lo tanto, la clave es Tipos de valores frente a los tipos primitivos. Según la definición de primitiva de Microsoft, es un tipo primitivo, pero en un sentido más general, no lo es.

+1

Tipos de valores y tipos _primitivos_? ¿Quizás te refieres a _los tipos de referencia_? –

-1

no lo son, porque son secuencia de caracteres

+2

debe hacer una copia de seguridad un poco más de su respuesta para que pueda ser valioso – JMax

3

Bajo la definición de "primitivo", la cadena no se considera un tipo primitivo de Microsoft. Por otro lado, Microsoft tiende a usar terminología sin formular realmente una definición clara o consistente (por ejemplo, "recurso no gestionado"), y podría ser útil definir "primitiva" para incluir "Cadena", "Matriz" y "Objeto", ya que en su ausencia no habría forma de definir tipos que pudieran emularlos de manera eficiente.

+0

Buena respuesta. VB.NET considera que 'DateTime' también es primitivo, lo cual está bastante bien según yo. – nawfal

35

No existe una definición "Microsoft" de lo que es un tipo primitivo.

Existen solo definiciones de tipos primitivos en un contexto dado.

  • The 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 especificación VB.NET versión 10 (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 espacio de nombre System), una forma de definir instancias de ese tipo con un literal; y permitiendo 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# es en la sección 4.1.4: Tipos simples.(la palabra "primitivo" solo se usa dos veces en el documento de 600 páginas); estos tipos primitivos se define simplemente como "los tipos de valores que tienen un alias de palabra clave en C#" - string no se menciona en esta 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)

Usted verá que sólo hay una superposición parcial entre todas estas cosas; el CLR ve ambos tipos de punteros como primitivos, tanto VB.NET como C# ven el decimal como un tipo primitivo/simple, solo VB.NET ve a DateTime como algo especial, tanto VB.NET como C# tienen un alias de palabra clave y una sintaxis literal para las cadenas pero sólo 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: contextos diferentes tienen diferentes definiciones de lo que es un "tipo primitivo" es . No importa, solo aprende cómo usar tu lenguaje de programación, no tiene sentido pelear y pensar sobre tales palabras polimórficas. Personalmente, me pregunto por qué existe la propiedad Type.IsPrimitive.

En cuanto a System.String:

  • CLR: No hay nada especial, es sólo un tipo de referencia;
  • VB.NET: Es un tipo primitivo;
  • C#: String es su propio copo de nieve muy especial;
+1

Para CLR, no creo que 'String' sea" solo otro tipo de referencia ". Las cadenas y las matrices son los únicos objetos cuyo tamaño no está implícito en sus tipos. Además, creo que la cadena es el único tipo de tipo para el cual el tiempo de ejecución, al cargar un ensamblaje, genera automáticamente instancias que contienen datos almacenados en ese ensamblaje. – supercat

+0

_ "tipos de valor que tienen un alias de palabra clave en C#" - cadena no se menciona en esa sección_. Bueno, la cadena es un tipo de referencia después de todo. –

+0

Estoy tratando de comprender las implicaciones de las diferencias "IsPrimitive" entre CLR, VB.NET y C#. Por ejemplo, si escribo código en C# que contiene una condición basada en que un objeto es un tipo primitivo, y mi prueba unitaria afirma que funciona como se espera para un DateTime (que C# considera que no es primitivo). Luego compilo una DLL a la que hace referencia un desarrollador que usa VB.NET (que considera que DateTime es primitivo), ¿el comportamiento de mi DLL será diferente (en otras palabras, la prueba de mi unidad solo es válida en el contexto de C# que es inútil?)? – Matt

Cuestiones relacionadas