C#: Про строки и выделение памяти

Пока на автомате не привык, нужно запомнить:

Например, если выполнить следующий фрагмент программы:

string a ="кол около колокола";
Console.WriteLine("Строка а: {0}", a);
a.Remove(0,4);
Console.WriteLine("Строка a: {0}", a);

Результат работы программы:

Cтрока a: кол около колокола
Cтрока a: кол около колокола

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

А вот в результате работы следующего фрагмента программы мы получим следующий результат:

string a ="кол около колокола";
Console.WriteLine("Cтрока a: {0}", a);
string b=a.Remove(0,4);
Console.WriteLine("Cтрока a: {0}", a);
Console.WriteLine("Cтрока b: {0}", b);

Результат работы программы:

Строка а: кол около колокола
Строка а: кол около колокола
Строка b: около колокола

Результат выполнения метода Remove, можно записать и в саму переменную a:

string a ="кол около колокола";
Console.WriteLine("Cтрока a: {0}", a);
а=a.Remove(0,4);
Console.WriteLine("Cтрока a: {0}", a);

Результат работы программы:

Строка а: кол около колокола
Строка а: около колокола

В этом случае будет потеряна ссылка на исходное строковое значение «кол около колокола», хотя оно и будет занимать память. Освободить занятую память сможет только сборщик мусора.

Рассмотрим следующий фрагмент программы:

string a="";
for (int i = 1; i <= 100; i++)
{
a +="!";
}
Console.WriteLine(a);

В этом случае в памяти компьютера будет сформировано 100 различных строк вида:
!
!!
!!!

!!!...!!
И только на последнюю из них будет ссылаться переменная а. Ссылки на все остальные строчки будут потеряны, но как и в предыдущем примере эти строки будут храниться в памяти компьютера и засорять ее. Бороться с таким засорением придется сборщику мусора, что будет сказываться на производительности программы.