Pregunta

Una discusión anterior me llevó hoy a la pregunta de si o no mi entendimiento de primtives y literales es correcta.


Mi entendimiento es que un tipo literal es específicamente un tipo que puede tener un valor asignado utilizando una notación que tanto humanos como compilador puede entender sin declaraciones de tipos específicos:

var firstName = "John"; // "John" is literal

var firstName = (string)"John"; // *if* the compiler didn't understand that "John"
                                // was a literal representation of a string then I
                                // would have to direct it as such

Mi comprensión de primitivas es que son esencialmente los tipos de datos elementales que el compilador puede comprender, como int:

int age = 25;

... un literal podría ser no primitiva, como el apoyo de VB9 para los literales XML. Un ejemplo del mundo no real sería si System.Drawing.Point podría ser asignado con literales:

Point somePoint = 2,2; // both X and Y are primitive values, however Point is a
                       // composite value comprised of two primitive values

Por último (y esta es la pregunta que a su vez me llevó a preguntar las preguntas anteriores): Mi opinión es que si un tipo es primitivo o literal no existe una relación directa de si se trata de un valor de referencia o tipo.

Por ejemplo System.String es un tipo de referencia que soporta literales. estructuras personalizados definidos son los tipos de valor de material compuesto que no soportan literales.

Tengo entendido (si no es mi explicación) correcta en su mayor parte?


Actualización: Gracias por la gran información y las conversaciones! Para que nadie se entere de esto, asegúrese de leer los comentarios, así como respuestas, hay algunos grandes aclaraciones se extienden alrededor, así como unos secundarios interesantes notas.

BTW: es un cara o cruz entre los cuales respuesta realmente es merecedor de obtener el gran cheque verde. Lo estoy dando a la respuesta por desgracia downvoted que contiene no sólo una respuesta decente, pero un montón de aclaración y de información en la cadena de comentarios. Para ser justos no hay una mejor respuesta aquí, hay al menos tres:)

¿Fue útil?

Solución

Creo que una cosa que no ha mencionado es el espacio y la asignación. Primitivas son tipos de valor y se asignan en la pila (siempre y cuando no están asociados con un objeto), excepto para el tipo de cadena como usted ha mencionado (la clase string asigna su espacio en el montón).

Aunque objetos mismos contienen primitivas allí reside almacenamiento donde se asigna el objeto real, que es en el montón.

Aparte de eso, su estado de cuenta está muy bien escrito. ¿Tiene una pregunta específica que echaba de menos:?)

Otros consejos

Sólo quería inyectar una nota rápida aquí.

La especificación del lenguaje C # define claramente "literal" - Un literal es un representación de código fuente de un valor . Los literales son cosas como true, 10, 5.7, 'c', "hello" y nula -. Que son texto que representa un valor específico

La especificación del lenguaje C # utiliza la palabra "primitivo" dos veces; nunca es definida y completamente vago en cuanto a lo que posiblemente podría significar.

La especificación del lenguaje C # no tiene ninguna necesidad de utilizar o definir la palabra "primitivo" y por lo tanto no debe hacer uso de este término vago. He tenido una charla con Mads y hemos acordado que las futuras ediciones de la especificación se da nueva redacción para eliminar completamente este uso.

Como otra especificaciones de los sistemas de tipo - la biblioteca de la reflexión, la CLI, la VES, y así sucesivamente - definir la palabra "primitivo" es, por supuesto, depende de ellos.

Gracias por traer a colación la cuestión.

  

Es mi comprensión (si no es mi explicación) correcta en su mayor parte?

No estoy de acuerdo en un punto: Un literal es una especie de constante de tiempo de compilación (como "Hello World", 5 o 'A'). Sin embargo, no hay "literal-Tipos"; lo literal es siempre el valor real.

Los tipos primitivos son OMI tipos "básicos" como cadena, int, double, float, corto, ...

Así primitiva tienen sus tipos de literales conectados con ellos.

Sí, un literal es un valor expresado en código fuente -. Así, mientras que VB es compatible con fecha / hora y los literales XML, C # no lo hace

A partir de la especificación C #, la sección 2.4.4:

  

literal es un código fuente   la representación de un valor.

Como usted dice, esto no está relacionado con el tipo de valor frente al tipo de referencia -. Cadena es de hecho un tipo de referencia

Una literal, que nadie ha mencionado todavía que null por cierto ...

Es también guarda relación con los tipos primitivos - desde Type.IsPrimitive :

  

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

... C # especificación no define la idea de un tipo "primitivo", pero tenga en cuenta que String no está en la lista anterior.

En términos de literales siendo constantes de tiempo de compilación ... en C # cada literales tiene una representación que puede ser al horno directamente en el conjunto; los literales supletorias en VB significa que no son constantes como el CLR entendería ellos - no se puede tener un const DateTime por ejemplo - pero siguen siendo literales

.

Aquí es una página de MSDN , hablando de los CLS, que incluye cadena como un tipo primitivo:

  

La biblioteca de clases de .NET Framework   incluye tipos que corresponden a la   tipos de datos primitivos que los compiladores   utilizar. De estos tipos, los siguientes son   Compatible con CLS: Byte, Int16, Int32,   Int64, individual, doble, de Boole, Char,   Decimal, IntPtr y String. Para más   información acerca de este tipo, consulte la   tabla de tipos de clases de .NET Framework   Descripción general de la biblioteca.

No se olvide también existe el ASP.Net clase literal .

EDIT: Por lo tanto, una respuesta a la pregunta del título es no, ya que no hay una clase de "primitivo" que proporciona la misma funcionalidad. Esto puede ser visto como una especie de respuesta de sabelotodo, sin embargo.

Creo que su comprensión es sobre todo correcto. Como dijo winSharp93, literales son valores que ellos mismos tienen tipos, pero no hay tal cosa como un "tipo literal". Es decir, mientras que usted puede tener literales de cadena, las cadenas no son un "tipo literal". Como has adivinado, lo que define un literal es que el valor se escribe directamente en el código fuente, aunque el requisito de que ningún tipo necesita ser especificada parece demasiado estrictas (por ejemplo, F # tiene literales de matriz, y se puede inferir el tipo de la matriz literal [| 1; 2; 3 |], pero no puede necesariamente inferir el tipo de la matriz [| |] literal vacío).

Por desgracia, no creo que hay un bien definición acordada de lo que hace un primitivo. Ciertamente, como señala Jon Skeet, el CLR tiene su propia definición de lo primitivo (Type.IsPrimitive), lo que descarta cuerdas. Sin embargo, otras fuentes reconocidas consideran string e incluso object a ser tipos primitivos dentro de C #. Yo prefiero esta definición, ya que no se encuentra incorporado el soporte en C # para cuerdas, como el uso del operador + para la concatenación y el uso de == como la igualdad de valor en lugar de la igualdad de referencia, así como el hecho de que el tipo de cadena puede se refiere a la utilización de la forma corta string lugar de tener que utilizar el nombre System.String completo.

Sólo para añadir que hay otro tipo que difumina el límite: System.Decimal , cuyos valores pueden expresarse como literales en el C # idioma, pero que no es un .Net tipo primitivo .

En mi humilde opinión tipos primitivos podría ser definida simplemente como tipos que directa "existe" en cada subyacente plataforma / host : si ya has jugado con el lenguaje ensamblador sabe que usted tiene bytes, palabras, palabras dobles ... pero no tienen cuerdas o decimales.

De hecho decimales .Net son " emulado " por el tiempo de ejecución .Net y no son manejados directamente por el hardware que sólo entiende IEEE 754 números de punto flotante (float y dobles que luego son tipos primitivos).

Por la extensión de la noción de valores literales "tipos literales" podría ser considerado como cualquier tipo cuyos valores pueden expresarse directamente en una lengua dada (C #, VB.Net, CIL ...) . Con esta definición tipos literal sería:. todos los tipos primitivos + cuerdas + decimales

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top