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])
возвращает ссылку на строковый объект ""
в пуле интернирования.