Ответ
В C# string (System.String) — это ссылочный тип данных, представляющий неизменяемую (immutable) последовательность символов UTF-16.
Ключевые особенности:
-
Неизменяемость (Immutability):
- Это самая важная характеристика. После создания строку нельзя изменить. Любая операция, которая кажется изменяющей строку (
ToUpper(),Replace(),+=), на самом деле возвращает совершенно новый объект строки в памяти.string s1 = "Hello"; string s2 = s1.ToUpper(); // s1 остаётся "Hello", s2 — новый объект "HELLO" s1 += " World"; // Создаётся новая строка "Hello World", s1 теперь ссылается на неё - Преимущества: потокобезопасность, простота, возможность хеширования и использования в качестве ключей словаря.
- Недостаток: потенциальные накладные расходы на память и производительность при частой конкатенации в циклах. Решение —
StringBuilder.
- Это самая важная характеристика. После создания строку нельзя изменить. Любая операция, которая кажется изменяющей строку (
-
Сравнение по значению:
- Хотя
string— ссылочный тип, операторы==и!=перегружены для сравнения содержимого строк, а не ссылок.string a = "test"; string b = "test"; Console.WriteLine(a == b); // True (сравнение значений) Console.WriteLine(object.ReferenceEquals(a, b)); // Может быть True из-за интернирования
- Хотя
-
Интернирование строк (String Interning):
- CLR поддерживает пул строк (
intern pool). При создании строкового литерала среда выполнения проверяет, есть ли такая же строка в пуле. Если есть — возвращает ссылку на существующий объект. Это экономит память. - Интернирование можно принудительно вызвать:
string.Intern()иstring.IsInterned().
- CLR поддерживает пул строк (
-
Форматирование и интерполяция:
- Интерполяция строк (C# 6+): Удобный и производительный способ вставки значений.
string name = "Alice"; int age = 30; string message = $"Меня зовут {name} и мне {age} лет."; - Компилируется в вызов
string.Formatили, для простых случаев, в более эффективную конкатенацию.
- Интерполяция строк (C# 6+): Удобный и производительный способ вставки значений.
-
Пустая строка и null:
string.Empty(или"") — корректный, пустой объект строки с нулевой длиной.null— отсутствие ссылки на какой-либо объект строки.- Используйте
string.IsNullOrEmpty()илиstring.IsNullOrWhiteSpace()для проверки.
Практический совет: Для интенсивной работы со строками (много операций конкатенации, особенно в циклах) используйте StringBuilder.
// ПЛОХО (создаётся много промежуточных строк):
string result = "";
for (int i = 0; i < 100; i++) result += i.ToString();
// ХОРОШО (создаётся один буфер):
var sb = new StringBuilder();
for (int i = 0; i < 100; i++) sb.Append(i);
string result = sb.ToString(); Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶