¿Qué son las palabras clave “nativas” y “literales”?

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

ejemplos:

string.Empty :

La constante vacía contiene el valor de cadena vacía. Necesitamos llamar al constructor de cadenas para que el comstackdor no marque esto como un literal . Marcar esto como un literal significaría que no aparece como un campo al que podemos acceder desde nativo .

Artículo de Wikipedia de C # vs Java:

Tipos simples / primitivos
Ambos idiomas admiten varios tipos incorporados que se copian y pasan por valor en lugar de por referencia. Java llama a estos tipos tipos primitivos, mientras que se les llama tipos simples en C #. Los tipos simples / primitivos típicamente tienen soporte nativo de la architecture del procesador subyacente.

De la sección 2.4.4 de la especificación de C #:

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

Así, por ejemplo, hay literales para cadenas y números:

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

… pero C # no tiene syntax literal para fechas y horas; tendrías que usar:

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

En cuanto al soporte nativo, aquí hay diferentes niveles de “nativo”, pero en lo que respecta a C #, generalmente lo considero un soporte específico para el tipo en cualquier formato de salida que se use. Así, por ejemplo, hay instrucciones de IL para tratar con los tipos de punto flotante binarios ( float , double ) pero cuando el comstackdor de C # emite código que trata con valores decimal , debe llamar a los operadores declarados en System.Decimal . Por lo tanto, consideraría que el float y el double tienen soporte nativo en IL, pero el decimal no.

(Sería posible escribir un comstackdor de C # dirigido a una plataforma diferente que tuviera soporte nativo para decimal , o que no tuviera soporte nativo para float y double , por ejemplo. Es poco probable, pero es posible).

Luego, cuando el IL se ejecuta en un motor de ejecución, se ejecutará sobre el código nativo “real”, por ejemplo, x86, que puede tener soporte específico para ciertos tipos. Ese es otro nivel de “nativo”. Por ejemplo, si alguien creara una nueva versión de IL que incluyera soporte nativo para decimal , eso no significaría que las CPUs de repente obtuvieran soporte nativo.

La cita de la cadena. El artículo vacío parece un caso clásico de comentarios de código que no están sincronizados con su 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 entendido mal, porque el comentario es confuso.

Hay una gran cantidad de información errónea sobre la cadena. Vacía, ya que es un caso un tanto extraño. La expresión new string () == “” 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 el nativo” se refiere al código nativo (el segundo significado de “nativo” que Jon Skeet mencionó). Pero si yo fuera tú, no gastaría mucho tiempo en ese artículo. Está demasiado preocupado por 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 verifique el IL. Si el IL es diferente, ejecute algunas pruebas de rendimiento.