Что такое string в C# и каковы его особенности?

«Что такое string в C# и каковы его особенности?» — вопрос из категории C# Core, который задают на 51% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C# string (System.String) — это ссылочный тип данных, представляющий неизменяемую (immutable) последовательность символов UTF-16.

Ключевые особенности:

  1. Неизменяемость (Immutability):

    • Это самая важная характеристика. После создания строку нельзя изменить. Любая операция, которая кажется изменяющей строку (ToUpper(), Replace(), +=), на самом деле возвращает совершенно новый объект строки в памяти.
      string s1 = "Hello";
      string s2 = s1.ToUpper(); // s1 остаётся "Hello", s2 — новый объект "HELLO"
      s1 += " World"; // Создаётся новая строка "Hello World", s1 теперь ссылается на неё
    • Преимущества: потокобезопасность, простота, возможность хеширования и использования в качестве ключей словаря.
    • Недостаток: потенциальные накладные расходы на память и производительность при частой конкатенации в циклах. Решение — StringBuilder.
  2. Сравнение по значению:

    • Хотя string — ссылочный тип, операторы == и != перегружены для сравнения содержимого строк, а не ссылок.
      string a = "test";
      string b = "test";
      Console.WriteLine(a == b); // True (сравнение значений)
      Console.WriteLine(object.ReferenceEquals(a, b)); // Может быть True из-за интернирования
  3. Интернирование строк (String Interning):

    • CLR поддерживает пул строк (intern pool). При создании строкового литерала среда выполнения проверяет, есть ли такая же строка в пуле. Если есть — возвращает ссылку на существующий объект. Это экономит память.
    • Интернирование можно принудительно вызвать: string.Intern() и string.IsInterned().
  4. Форматирование и интерполяция:

    • Интерполяция строк (C# 6+): Удобный и производительный способ вставки значений.
      string name = "Alice";
      int age = 30;
      string message = $"Меня зовут {name} и мне {age} лет.";
    • Компилируется в вызов string.Format или, для простых случаев, в более эффективную конкатенацию.
  5. Пустая строка и 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();