Пожалуйста объясните в чём разница

Пожалуйста объясните в чём разница

Если пишу такой код:

class MainClass {
  public static void Main (string[] args) {

    string str = "Hello Bro";
    
    string[] vowels = new string[] { "A", "a", "E", "e", "I", "i", "O", "o", "U", "u" }; 
   
    for (int i = 0; i < vowels.Length; i++) {

      str = str.Replace(vowels[i], "");
      
    }
    Console.WriteLine(str);
  }
}

Вывод в консоль: Hll Br

По сути то что и требовалось, но если пишу такой код:

class MainClass {
  public static void Main (string[] args) {

    string str = "Hello Bro";
    
    string[] vowels = new string[] { "A", "a", "E", "e", "I", "i", "O", "o", "U", "u" }; 

    string result = "";
   
    for (int i = 0; i < vowels.Length; i++) {

      result = str.Replace(vowels[i], "");
      
    }
    Console.WriteLine(result);
  }
}

То вывод в консоль следующий: Hello Bro

Это уже не то что требовалось, и собственно вопрос в следующем, почему если я завожу новую переменную и присваиваю туда решение то у меня один вывод, а если я присваиваю решение в старую переменную, то у меня другой вывод?


Ответы (2 шт):

Автор решения: ssa112112

Потому что метод Replace не меняет значение в исходной строке, а только возвращает новую. Таким образом на последней итерации цикла вы в result кладете оригинальную строку str из которой убрана строка u.

→ Ссылка
Автор решения: Максим Фисман

Как-то все скупы на разъяснения, однако...

Метод Replace(char oldChar, char newChar возвращает новую строку, в которой значения oldChar заменены на newChar/ Из документации:
Returns a new string in which all occurrences of a specified Unicode character in this instance are replaced with another specified Unicode character.

В той же документации отдельным пояснением указано: This method does not modify the value of the current instance. Instead, it returns a new string in which all occurrences of oldChar are replaced by newChar.

То есть метод этот саму строку НЕ изменяет, а просто возвращает новую, в которой все вхождения oldChar заменены на newChar...

В вашем коде в цикле в переменную result будут поочередно записываться значения:

Hello Bro - без A
Hello Bro - без a
Hello Bro - без E
Hllo Bro - без e
Hello Bro - без I
Hello Bro - без i
Hello Bro - без O
Hell Br - без o
Hello Bro - без U
Hello Bro - без U

Так как изначальная строка str будет оставаться одинаковой, то эти гласные буквы будут удаляться каждут итерацию из изначальной строки Hello Bro

→ Ссылка