Изменчивость строки, когда строка не меняется в C#?

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

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

я знаю разницу между строкой и stringbuilder в C#.

3 ответа

Решение

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

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();
        }
    }
}

Нет, это не так. Вы можете просто проверить это, используя 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 

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

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

Другие вопросы по тегам