2012-04-11 11 views
6

文字列は暗黙的にインスタンス化されているので、オブジェクトの参照を取得するためにnewを使用する必要はありません。最初の行があることが表示されますがldstrは内部的にnewobjを実装していますか?

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

:ので、常にフレームワークは、このの世話をしている、と私はこのような何かをした場合ので、私は同じILになるだろうというのが私の信念だった。この

newobj instance void [mscorlib]System.String::.ctor(char[]) と第2のldstr "a"を使用して行われます。

文字列参照を取得するには、ldstrは内部でnewobjと呼び出していますか?これをバックアップする仕様/詳細はどこで確認できますか?

答えて

8

ldstrは、per the documentationというリテラル文字列への参照を提供します(デフォルトではリテラル文字列が使用されているため、1回のみ作成されます)。最初のステートメントは、newobj命令を期待どおりに使用して、stringという正規のインスタンスを作成します。

+0

ありがとう@ブライアン、私はドキュメントがどこにあるのか分からなかった! –

1

stringは単に newにあなたがnewobjを参照してください理由です、参照オブジェクトタイプのための股関節の基本的なガイドラインに従います。

Infactはあなたがこのような何かを書くしようとした場合、それはnewobjを生成しません。

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

あなただけ

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

を書く場合は、結果の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 

になりますが結果ILは

になります
IL_0000: ldc.i4.2  
IL_0001: stloc.0  
IL_0002: ldloc.0  
IL_0003: call  System.Console.WriteLine 

割り当ての視点(自然に欠けている行があります)との差はありませんので、値の種類について話しています。

+0

はい。誰がそれを示したと言いましたか?私は値の型に同じunsingがその命令を注入しないことを示します。 – Tigran

+0

@BrianRasmussen:それをもっと明確にするために編集された答え。 – Tigran

+0

申し訳ありませんが、私はあなたの意見を誤解しました。 –

関連する問題