2012-04-11 16 views
6

Come tutti sappiamo, le stringhe sono implicitamente istanziate, il che significa che non è necessario utilizzare new per ottenere un riferimento a un oggetto di uno.ldstr implementa internamente newobj?

A causa di questo, è stata sempre la mia convinzione che il quadro sta prendendo cura di questo, e di conseguenza mi otterrebbe IL identico se ho fatto qualcosa di simile:

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

Tuttavia sembra che la prima linea è fatto utilizzando newobj instance void [mscorlib]System.String::.ctor(char[]) e il secondo ldstr "a".

Quindi, per ottenere un riferimento di stringa, ldstr chiama internamente newobj e dove posso vedere la specifica/i dettagli per eseguire il backup di questo?

risposta

8

ldstr fornisce il riferimento alla stringa letterale come per the documentation (ricorda che le stringhe letterali sono internate per impostazione predefinita, quindi vengono create una sola volta). La prima istruzione crea un'istanza regolare di string utilizzando l'istruzione newobj come previsto.

+0

Grazie a @Brian, non sapevo dove fossero i documenti! –

1

string segue semplicemente tha orientamento di base per riferimento tipi di oggetti, è per questo che il new vedete newobj.

Infatti, se si tenta di scrivere qualcosa di simile a questo, sarà non genera newobj:

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

L'IL risultante sarà

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 

se si scrive solo

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

risultato IL sarà

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

Nessuna differenza dal punto di vista dell'assegnazione (c'è una linea persa naturalmente), perché stiamo parlando di tipo di valore.

+0

Sì. Chi ha detto che mostra? Io mostro che unsing lo stesso sul tipo di valore non inietta quella istruzione. – Tigran

+0

@BrianRasmussen: modifica la risposta per renderla più chiara. – Tigran

+0

Scusa, ho frainteso il tuo punto. –

Problemi correlati