Если операция строки не изменяет значение строки, это приведет к созданию нового экземпляра? Eg;
string str="foo";
str+="";
Я знаю разницу между строкой и строкой в С#.
Если операция строки не изменяет значение строки, это приведет к созданию нового экземпляра? Eg;
string str="foo";
str+="";
Я знаю разницу между строкой и строкой в С#.
Нет, новый экземпляр будет создан только тогда, когда операция 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();
}
}
}
Нет, нет. Вы можете просто протестировать его с помощью 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(строка, строка), обычно это то, что компилятор включает в себя "добавление" строки, проверяет, является ли один из аргументов нулевым или пустым, и возвращает аргумент non-NullOrEmpty. Таким образом, в вашем примере он просто вернет str, и никакой объект не будет создан.
В действительности, компилятор может оптимизировать всю вашу работу, заметив, что вы просто конкатенируете пустую строку. Лучшим критерием будет то, где оба значения являются переменными, и один содержит пустую строку.