2012-04-11 11 views
6

Wie wir alle wissen, werden Strings implizit instanziiert, was bedeutet, dass wir new nicht verwenden müssen, um einen Verweis auf ein Objekt von eins zu erhalten.Implementiert ldstr intern newobj?

dieses Weil es immer meine Überzeugung war, dass der Rahmen dieser kümmert und daher würde ich gleich IL, wenn ich so etwas wie dies tat:

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

Allerdings scheint es, dass die erste Zeile getan unter Verwendung newobj instance void [mscorlib]System.String::.ctor(char[]) und der zweite ldstr "a".

Also, um eine Zeichenkettenreferenz zu erhalten, ruft ldstr intern newobj auf und wo kann ich die Spezifikation/Details sehen, um dies zu unterstützen?

Antwort

8

ldstr gibt Ihnen den Verweis auf die Literalzeichenfolge als per the documentation (erinnern Sie sich, literale Zeichenfolgen werden standardmäßig gespeichert, so dass sie nur einmal erstellt werden). Die erste Anweisung erstellt eine reguläre Instanz von string unter Verwendung der newobj-Anweisung wie erwartet.

+0

Danke @Brian, ich wusste nicht, wo die Docs waren! –

1

string folgt einfach tha Richtlinie für Referenz Objekttypen, deshalb auf new Sie newobj sehen.

Infact, wenn Sie versuchen, etwas zu schreiben, wird es newobj nicht erzeugen:

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

Das resultierende IL

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 

sein, wenn Sie gerade schreiben

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

Ergebnis IL wird

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

Kein Unterschied von der Zuordnungsseite (es gibt natürlich eine verpasste Zeile), weil wir über den Werttyp sprechen.

+0

Ja. Wer hat gesagt, dass es zeigt? Ich zeige, dass die Verwendung des gleichen Werttyps diesen Befehl nicht injiziert. – Tigran

+0

@BrianRasmussen: bearbeitete Antwort, um es klarer zu machen. – Tigran

+0

Entschuldigung, ich habe Ihren Standpunkt missverstanden. –