6

new文字列は暗黙的にインスタンス化されることは誰もが知っていることです。つまり、1つのオブジェクトへの参照を取得するために使用する必要はありません。

このため、フレームワークがこれを処理しているというのが常に私の信念でした。したがって、次のようなことをすると、同じILが得られます。

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

ただし、最初の行はとを使用newobj instance void [mscorlib]System.String::.ctor(char[]) して行われているようldstr "a"です。

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

4

2 に答える 2

8

ldstrドキュメントに従ってリテラル文字列への参照を提供します(リテラル文字列はデフォルトでインターンされるため、一度だけ作成されることに注意してください)。最初のステートメントは、期待どおりに命令をstring使用する通常のインスタンスを作成します。newobj

于 2012-04-11T18:05:06.170 に答える
1

string参照オブジェクトタイプの基本的なガイドラインに従うだけです。そのため、が表示されnew ますnewobj

実際、このようなものを書き込もうとしても、生成されませんnewobj

int a = new 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

あなたがただ書くなら

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

結果ILは

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

割り当ての観点との違いはありません(当然、行が欠落しています)。値型について話しているからです。

于 2012-04-11T18:05:41.953 に答える