は、私が呼び出す場合:リテラルな文字列の代入によって、このようなStringコンストラクタが呼び出されますか?好奇心のうち
string txt = "text";
それは舞台裏で、これを呼び出すのだろうか?
string txt = new String("text".ToCharArray())?
は、私が呼び出す場合:リテラルな文字列の代入によって、このようなStringコンストラクタが呼び出されますか?好奇心のうち
string txt = "text";
それは舞台裏で、これを呼び出すのだろうか?
string txt = new String("text".ToCharArray())?
いいえ、それはできません。このコードは直接IL stloc
コマンドに変換されます。基本的には次のようにコンパイルされます。
ldstr "text"
stloc.0
は、私はそれを疑う - なぜだろう、それ
しかし、なぜ自分を探し、実行ILDASMとintern poolと記憶するから
string txt1 = "text";
負荷文字列"text"
を発生させるどのようなコード表示されませんtxt1
変数のリファレンスとして使用します。
だから、例えば、あなたが持っているならば、ReferenceEquals(txt2, txt3) == true
string txt2 = "text";
string txt3 = "text";
、両方の変数は、インターンプールに同じ文字列オブジェクトを参照するため。
String Constructorは、新しい非文字列オブジェクトを作成します。
string txt4 = new String("text".ToCharArray());
so ReferenceEquals(txt1, txt4) == false
。
例外はあります。new String(new char[0])
は、インタープール内の""
文字列オブジェクトへの参照を返します。