出于好奇,如果我打电话:
string txt = "text";
它会在幕后调用吗?
string txt = new String("text".ToCharArray())?
答案 0 :(得分:7)
string txt1 = "text";
从intern pool加载字符串"text"
,并将其作为参考存储在txt1
变量中。
所以,例如,如果你有
string txt2 = "text";
string txt3 = "text";
然后是ReferenceEquals(txt2, txt3) == true
,因为两个变量都引用了实习池中的相同字符串对象。
String Constructor创建一个新的非实习字符串对象。
string txt4 = new String("text".ToCharArray());
所以ReferenceEquals(txt1, txt4) == false
。
有一个例外:new String(new char[0])
返回对实习池中""
字符串对象的引用。
答案 1 :(得分:2)
不,不会。此代码将直接转换为IL stloc
命令。它基本上将编译为以下
ldstr "text"
stloc.0
答案 2 :(得分:-1)
我对此表示怀疑 - 为什么会这样呢
但为什么不自己寻找,运行ildasm并查看生成的代码