Создает ли String.Replace() новую строку, если ничего не заменить?

Например:

public string ReplaceXYZ(string text)
{
    string replacedText = text;

    replacedText = replacedText.Replace("X", String.Empty);
    replacedText = replacedText.Replace("Y", String.Empty);
    replacedText = replacedText.Replace("Z", String.Empty);

    return replacedText;
}

Если бы я должен был называть "ReplaceXYZ" даже для строк, которые не содержат "X", "Y" или "Z", будет ли создаваться 3 новые строки каждый раз?

Я заметил код, подобный этому в одном из наших проектов. Он многократно вызывается, когда он проходит через большой набор строк.

Ответ 1

Он не возвращает новый экземпляр, если ничего не нужно заменить:

string text1 = "hello world", text2 = text1.Replace("foo", "bar");
bool referenceEqual = object.ReferenceEquals(text1, text2);

После выполнения этого кода referenceEqual устанавливается на true.

Еще лучше, это поведение задокументировано:

Если oldValue не найден в текущем экземпляре, метод возвращает текущий экземпляр без изменений.

В противном случае это будет зависящим от реализации и может измениться в будущем.

Обратите внимание, что существует аналогичная оптимизация для вызова Substring(0) по значению string:

Если startIndex равно нулю, метод возвращает исходную строку без изменений