В .NET строки являются неизменяемыми, что означает, что их нельзя изменить.
Они также являются ссылочными типами, что означает, что при создании строки строковый объект создается в куче со ссылкой на его расположение в памяти в куча.

Когда вы создаете строку без использования оператора new, CLR сначала находит совпадающую строку,
и, если находит, создает новую ссылку, указывающую на ту же строку в куче.
Вот почему в первом методе TestStrings1() в приведенном ниже коде это не только одно и то же значение, но и один и тот же объект.

Однако в TestStrings2() вы явно создаете новый объект с помощью оператора new.
Это означает, что в куче будет два строковых объекта. Таким образом, строки имеют одно и то же значение, но являются разными объектами.

Чтобы лучше понять это, запустите приведенный ниже код в консольном приложении C#: