2011-12-11 19 views
9

Veo muchas veces el uso de nativos y literales "palabras clave" en los artículos de C#. ¿Qué quieren decir?Palabras clave "nativas" y "literales"

ejemplos:

string.Empty article:

La constante de vacío mantiene el valor de cadena vacía. Necesitamos llamar al String constructor para que el compilador no marque esto como literal. Marcar esto como literal significa que no aparece como un campo al que podemos acceder desde nativo.

C# vs Java Wikipedia article:

/tipos primitivos simples
Ambos lenguajes soportan un número de incorporados tipos que se copian y pasan por valor y no por referencia. Java llama a estos tipos tipos primitivos, mientras que se llaman tipos simples en C#. Los tipos simple/primitivo normalmente tienen nativo compatible con de la arquitectura del procesador subyacente.

Respuesta

14

Desde la sección de especificaciones C# 2.4.4:

A literal es una representación del código fuente de un valor.

Así por ejemplo, no son literales de cadenas y números:

string x = "hello"; 
int y = 10; 

... pero C# no tiene la sintaxis literal de las fechas y horas; habría que utilizar:

DateTime dt = new DateTime(2011, 12, 11); 

En cuanto a la compatibilidad nativa - hay diferentes niveles de "nativo" aquí, pero en lo que se refiere a C#, yo por lo general considerarlo compatible con el tipo específico de salida en cualquier formato se utiliza. Entonces, por ejemplo, son instrucciones IL para tratar con los tipos de punto flotante binario (float, double) pero cuando el compilador C# emite código que trata con valores decimal, debe llamar a los operadores declarados en System.Decimal. Por lo tanto, consideraría que float y double tienen compatibilidad nativa en IL, pero decimal no.

(Sería posible escribir un compilador de C# focalización una plataforma diferente, lo que hizo tienen soporte nativo para decimal -. O que no tienen soporte nativo para float y double, por ejemplo Es poco probable, pero posible.)

Luego, cuando el IL se ejecuta en un motor de ejecución, se ejecutará sobre el código nativo "real" - x86 por ejemplo - que puede tener soporte específico para ciertos tipos. Ese es otro nivel de "nativo". Por ejemplo, si a alguien se le ocurrió una nueva versión de IL que incluye soporte nativo para decimal, eso no significa que las CPUs de pronto obtuvieron soporte nativo.

+0

podría ser amable y actualizar la publicación con una explicación a esta frase de acuerdo con su respuesta: "Marcar esto como ** literal" significaría que no aparece como un campo al que podemos acceder * * nativo ** " – gdoron

+2

@gdoron: No lo sé - no tiene mucho sentido para mí, para ser sincero. Creo que se trata de acceso desde código nativo, en lugar de soporte para tipos nativos, pero no sé los detalles detrás del comentario. –

2

La cita de la cadena. El artículo vacío parece un caso clásico de comentarios de código que no se sincronizan con el código asociado. El comentario dice "estamos llamando al constructor en lugar de usar un literal", pero el código no llama al constructor: usa el literal. La moraleja de la historia: no permitas que tu confusión te haga pensar que has malentendido, porque el comentario es confuso.

Hay una gran cantidad de información errónea respecto a la cadena. Vacila, ya que es un poco extraño. La expresión nueva cadena() == "" generalmente se espera que sea falsa, ya que generalmente se espera que el nuevo operador cree una nueva instancia. Pero no crea una nueva instancia, devuelve la instancia en el grupo interno, que es lo mismo que "", por lo que la expresión es verdadera.

Sospecho que el "nativo" en "acceso desde nativo" se refiere al código nativo (el segundo significado de "nativo" que Jon Skeet mencionó). Pero si fuera tú, no pasaría demasiado tiempo en ese artículo. Está demasiado preocupado con la teoría abstracta que de todos modos parece incorrecta.

Si desea saber si string.Empty es más o menos eficiente que "", compile dos versiones de la misma función y compruebe el IL. Si el IL difiere, ejecute algunas pruebas de rendimiento.

+0

¡Gracias por la salvación de esos comentarios y artículos! – gdoron

+0

El comentario no está desactualizado. Significa que se llamará al constructor CLASS. La inicialización de campos y propiedades estáticos crea implícitamente un constructor de clase que se llama automáticamente la primera vez que se hace referencia a la clase. – Jesse

Cuestiones relacionadas