Изменчивость строки, когда строка не меняется в 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, и объект не будет создан.
В действительности, однако, компилятор может оптимизировать всю вашу работу, заметив, что вы просто конкатенируете пустую строку. Лучше было бы проверить, где оба значения являются переменными, а одно содержит пустую строку.