Мутируемость строки, когда строка не изменяется в С#?

Если операция строки не изменяет значение строки, это приведет к созданию нового экземпляра? Eg;

string str="foo";
str+="";

Я знаю разницу между строкой и строкой в ​​С#.

Ответ 1

Нет, новый экземпляр будет создан только тогда, когда операция string изменит значение в строковой переменной. это можно доказать, используя ObjectIDGenerator class.it стоит прочитать этот полный article для доказательства

using System;
using System.Text;
using System.Runtime.Serialization;

namespace StringVsStringBuilder
{
    class Program
    {
        static void Main(string[] args)
        {
            ObjectIDGenerator idGenerator = new ObjectIDGenerator();
            bool blStatus = new bool();
            //blstatus indicate whether instance is new or not
            string str = "Fashion Fades,Style Remains Same";
            Console.WriteLine("initial state");
            Console.WriteLine("str = {0}",str);
            Console.WriteLine("instance id : {0}",idGenerator.GetId(str,out blStatus));
            Console.WriteLine("this is new instance : {0}",blStatus);
            //a series of operations that won't change value of str
            str += "";
            //try to replace character 'x' which is not present in str so no change
            str = str.Replace('x','Q');
            //trim removes whitespaces from both ends so no change
            str = str.Trim();
            str = str.Trim();
            Console.WriteLine("\nfinal state");
            Console.WriteLine("str = {0}", str);
            Console.WriteLine("instance id : {0}", idGenerator.GetId(str, out blStatus));
            Console.WriteLine("this is new instance : {0}", blStatus);
            Console.ReadKey();
        }
    }
}

enter image description here

Ответ 2

Нет, нет. Вы можете просто протестировать его с помощью object.ReferenceEquals() следующим образом:

        string s = "test";
        string q = s;
        s += "";
        bool eq1 = object.ReferenceEquals(s, q); //--> References are equal
        s += "1";
        bool eq2 = object.ReferenceEquals(s, q); //--> References are not equal any more 

Ответ 3

String.Concat(строка, строка), обычно это то, что компилятор включает в себя "добавление" строки, проверяет, является ли один из аргументов нулевым или пустым, и возвращает аргумент non-NullOrEmpty. Таким образом, в вашем примере он просто вернет str, и никакой объект не будет создан.

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