Будет ли буквальное строковое присвоение вызывать конструктор String следующим образом? - PullRequest
1 голос
/ 14 марта 2012

Из любопытства, если я позвоню:

 string txt = "text"; 

Будет ли это называться за кадром?

 string txt = new String("text".ToCharArray())?

Ответы [ 3 ]

7 голосов
/ 14 марта 2012
string txt1 = "text"; 

загружает строку "text" из внутреннего пула и сохраняет ее как ссылку в переменной txt1.

Так, например, если у вас есть

string txt2 = "text"; 
string txt3 = "text"; 

затем ReferenceEquals(txt2, txt3) == true, поскольку обе переменные ссылаются на один и тот же строковый объект в пуле интернирования.

Конструктор String создает новый, не интернированный строковый объект.

string txt4 = new String("text".ToCharArray());

Итак ReferenceEquals(txt1, txt4) == false.

Существует одно исключение: new String(new char[0]) возвращает ссылку на строковый объект "" в пуле интернирования.

2 голосов
/ 14 марта 2012

нет не будет. Этот код будет преобразован непосредственно в команду IL stloc. По существу это скомпилируется в следующее

ldstr "text"
stloc.0
0 голосов
/ 14 марта 2012

я сомневаюсь - с чего бы это

Но почему бы не поискать себя, запустить ildasm и посмотреть, какой код сгенерирован

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...