2012-04-11 12 views
6

Como todos sabemos, las cadenas se instancian implícitamente, lo que significa que no tenemos que usar new para obtener una referencia a un objeto de una.¿ldstr implementa internamente newobj?

Debido a esto siempre era mi creencia de que el marco se hace cargo de esto, y de ahí que obtendría IL idénticos si hice algo como esto:

String first = new String(new char[] {'a'}); 
string second = "a"; 

Sin embargo, parece que la primera línea es hecho usando newobj instance void [mscorlib]System.String::.ctor(char[]) y el segundo ldstr "a".

Entonces, para obtener una referencia de cadena, ¿ldstr llama internamente al newobj y dónde puedo ver la especificación/detalles para respaldar esto?

Respuesta

8

ldstr le da la referencia a la cadena literal como per the documentation (recuerde que las cadenas literales están internadas por defecto, por lo que solo se crean una vez). La primera instrucción crea una instancia regular de string usando la instrucción newobj como se esperaba.

+0

Gracias @Brian, ¡no sabía dónde estaban los documentos! –

1

string simplemente sigue tha guía básica para referencia tipos de objetos, por eso en new ves newobj.

De hecho si se intenta escribir algo como esto, no va a generar newobj:

int a = new int(); 
a = 2; 
Console.WriteLine(a); 

La IL resultante será

IL_0000: ldc.i4.0  
IL_0001: stloc.0  
IL_0002: ldc.i4.2  
IL_0003: stloc.0  
IL_0004: ldloc.0  
IL_0005: call  System.Console.WriteLine 

si se escribe simplemente

int a = 2; 
Console.WriteLine(a); 

resultado IL será

IL_0000: ldc.i4.2  
IL_0001: stloc.0  
IL_0002: ldloc.0  
IL_0003: call  System.Console.WriteLine 

No hay diferencia desde el punto de vista de la asignación (hay líneas perdidas naturalmente), porque estamos hablando del tipo de valor.

+0

Sí. ¿Quién dijo que se nota? Muestro que al usar lo mismo en el tipo de valor no se inyecta esa instrucción. – Tigran

+0

@BrianRasmussen: respuesta editada para hacerlo más claro. – Tigran

+0

Lo siento, he entendido mal tu punto. –

Cuestiones relacionadas