Elementor Header #8

33. Неизменяемость строк

33. Неизменяемость строк в C#

1. Введение

В C# строки (string) являются неизменяемыми (immutable). Это означает, что после создания строка не может быть изменена. Любая операция, которая кажется изменяющей строку, на самом деле создаёт новую строку, а старая остаётся без изменений.

📌 Пример:

				
					string str = "Hello";
str += " World"; // Создаётся новая строка, а не изменяется старая
Console.WriteLine(str); // Выведет "Hello World"

				
			

🔹 Переменная str теперь указывает на новую строку "Hello World", а старая строка "Hello" осталась в памяти до момента её удаления сборщиком мусора.


2. Почему строки неизменяемы?

Основные причины неизменяемости строк:

  1. Оптимизация памяти – неизменяемые строки могут использоваться повторно (интернирование строк).
  2. Безопасность – строки часто используются в ключах, паролях, хешировании, и их нельзя подменить.
  3. Упрощение многопоточного программирования – неизменяемые объекты безопасны для потоков.

📌 Пример интернирования строк:

				
					string a = "Hello";
string b = "Hello";

Console.WriteLine(object.ReferenceEquals(a, b)); // True (оба указывают на один объект в памяти)

				
			

🔹 C# использует пул строк, поэтому одинаковые строковые литералы могут ссылаться на один и тот же объект.


3. Операции со строками создают новые объекты

Любая операция над строкой не изменяет её, а создаёт новую строку.

📌 Пример:

				
					string text = "C#";
text.ToUpper(); // Создана новая строка "C#" -> "C#", но не изменён text

Console.WriteLine(text); // Выведет "C#"

				
			

🔹 ToUpper() возвращает новую строку, но text остаётся неизменным.

Чтобы сохранить результат, нужно присвоить его обратно:

				
					text = text.ToUpper();
Console.WriteLine(text); // "C#"

				
			

4. Использование StringBuilder для изменения строк

Если нужно часто изменять строку (например, добавлять или удалять символы), лучше использовать StringBuilder. Он изменяет строку без создания новых объектов в памяти.

📌 Пример:

				
					using System;
using System.Text;

class Program
{
    static void Main()
    {
        StringBuilder sb = new StringBuilder("Привет");
        sb.Append(", мир!"); // Изменяется сам объект StringBuilder

        Console.WriteLine(sb); // Выведет "Привет, мир!"
    }
}

				
			

🔹 В отличие от string, StringBuilder изменяет строку, а не создаёт новую.

Заключение

Строки в C# неизменяемы, любая операция создаёт новую строку.
Неизменяемость помогает в оптимизации памяти, потокобезопасности и защите данных.
Использование StringBuilder позволяет изменять строки эффективно без лишних выделений памяти.

🚀 Теперь вы знаете, как работать со строками в C# и когда использовать StringBuilder!

Тестовое задание

  1. Создайте строку s = "Hello" и попробуйте изменить её, добавив " World".
  2. Используйте StringBuilder для добавления "!!!" к строке.
  3. Выведите результат в консоль.

📌 Пример решения:

				
					using System;
using System.Text;

class Program
{
    static void Main()
    {
        string s = "Hello";
        s += " World"; // Создаётся новая строка
        Console.WriteLine(s); // Выведет "Hello World"

        StringBuilder sb = new StringBuilder(s);
        sb.Append("!!!"); // Добавляем в StringBuilder
        Console.WriteLine(sb); // Выведет "Hello World!!!"
    }
}

				
			

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

logo