2009-10-21 17 views
7

He estado tratando de entender el uso de "primitivos" en Java y C# y la diferencia entre ellos (Si alguna). He hecho una serie de preguntas sobre SO y algunas de las respuestas parecen confundir el problema en lugar de aclararlo. Algunas respuestas (y algunos documentos de MS) parecen proporcionar declaraciones contradictorias. Desde SODefiniciones de "primitivo", "tipo de valor", "estructura", "clase", "ajuste" en Java y C#

y desde MS: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx - "las estructuras son muy similares a las clases" - "la clase Int32 envuelve el tipo de datos int" - "En Por otro lado, 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. Por ejemplo, int es el nombre abreviado de System .Int32 ".

Mi confusión recae principalmente en C# (he programado java por algún tiempo).

EDITAR el siguiente apartado se ha confirmado que es correcta por @ Jon Skeet

  • Java tiene dos tipos primitivos (y de clase). Las palabras "tipo de valor" podrían ser un sinónimo de primitivo (aunque no ampliamente utilizado) y "tipo de referencia" para la clase. Java "envuelve" primitivos (int) en las clases (entero) y estas clases tienen el poder completo de cualquier otra clase (puede ser nulo, utilizado en las colecciones, etc.)

EDITAR @ Jon ha dado una declaración muy clara sobre C# por lo que eliminaré mis verdades sugeridas y me referiré a su respuesta.

Pregunta adicional: ¿Existe un consenso sobre cuál debería ser el uso real de estos términos? Si hay un consenso, estaría muy agradecido por haberlo explicado explícitamente. De lo contrario, supongo que la terminología es confusa y, por lo tanto, de uso limitado.

RESUMEN Gracias por respuestas muy claras. Existe un consenso (ver respuesta aceptada de @Jon) entre aquellos que realmente entienden esto y los documentos de MS son consistentes (aunque se refieren a Java en algunos lugares y los he leído mal para C#)

Respuesta

11

El primer punto es correcto.

El segundo no es: the primitive types en .NET son Booleano, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Doble y Único. Una estructura no puede generalmente establecerse en null, pero también hay tipos de valores que aceptan valores numéricos (Nullable<T>). Estos todavía son tipos de valor, pero hay azúcar sintáctico en C# para equiparar "nulo" con "el valor nulo para el tipo", que para un tipo de valor que admite nulos es una instancia donde HasValue devuelve falso.

int y System.Int32son sinónimos verídicos en C#. El primero es solo un alias para este último. Compilan a exactamente el mismo código.

En C#, las clases y las interfaces son siempre tipos de referencia. Las estructuras y las enumeraciones son tipos de valores, pero hay un equivalente en cuadro de cada estructura (que no sea Nullable<T> que el CLR maneja de manera diferente en términos de boxeo). Los tipos enmarcados no tienen nombres separados, y no se pueden referir explícitamente en C# (aunque pueden estar en C++/CLI). No hay separado clase de contenedor equivalente a java.lang.Integer en .NET; sería problemático introducir tales clases ya que puede crear sus propios tipos de valores en .NET, a diferencia de Java.

Para obtener más información sobre tipos de referencia y tipos de valores, consulte my article about it.

+1

@Jon editó la pregunta y eliminó el segundo punto, en su lugar, señaló su respuesta. –

12

No he visto documentos de MS ser contradictorio sobre esto (MSDN a veces está equivocado, pero en este tema específico, siempre lo he visto correcto). El enlace de MSDN informados dice:

Para cada tipo de datos primitivo en Java, la biblioteca de clases núcleo proporciona una clase envoltorio que lo representa como un objeto Java . Por ejemplo, la clase Int32 ajusta el tipo de datos int, y la clase doble ajusta el tipo de datos dobles .

Por otro lado, 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.

Básicamente, está diciendo lo correcto. En Java, la clase Integer es un contenedor para el tipo primitivo int. En C#, int es un alias para la estructura System.Int32. El primer párrafo es sobre Java y no aplica a C#.


En NET, la terminología es la siguiente:

A primitivo tipo es un tipo que tiene IsPrimitive property conjunto a verdadero. Los tipos primitivos son:

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

Todos los tipos primitivos son tipos de valor pero no al revés.

A tipo de valor es un type that has value semantics, as opposed to reference semantics. El valor completo se copia cuando se pasa por valor (no es su referencia). Las variables locales de los tipos de valores se almacenan en la pila. struct sy enum s son tipos de valor.

Como se mencionó anteriormente, todos los tipos primitivos son tipos de valores. Son struct s en el espacio de nombre System. En C#, int, double, etc., las palabras clave son básicamente alias para esos struct s.

Cuestiones relacionadas