Строки в C#: создание, свойства, методы и лучшие практики
Что такое строка в C#
В C# строки — это объекты типа System.String (псевдоним string). Строки неизменяемы (immutable): любая операция, меняющая строку, создаёт новый объект.
Создание строк
// 1. Строковый литерал
string s1 = "Hello";
// 2. Конкатенация
string fname = "Rowan", lname = "Atkinson";
string full = fname + " " + lname; // "Rowan Atkinson"
// 3. Конструктор из char[]
char[] letters = { 'H', 'e', 'l', 'l', 'o' };
string s2 = new string(letters); // "Hello"
// 4. Методы, возвращающие строку
string[] parts = { "Hello", "World" };
string joined = String.Join(" ", parts); // "Hello World"
// 5. Форматирование
DateTime dt = new DateTime(2024, 1, 15, 14, 30, 0);
string formatted = String.Format("Дата: {0:d}, Время: {0:t}", dt);
// "Дата: 15.01.2024, Время: 14:30"
// 6. Интерполирование строк (C# 6.0+) — ПРЕДПОЧТИТЕЛЬНЫЙ СПОСОБ
string interpolated = $"Привет, {fname}! Сегодня {dt:d}.";
Свойства класса String
| Свойство | Описание |
|---|---|
Length | Число символов (char) в строке |
Chars[int index] | Индексатор для доступа к символу (только чтение) |
string s = "Hello";
Console.WriteLine(s.Length); // 5
Console.WriteLine(s[1]); // 'e'
Основные методы String
| Метод | Описание |
|---|---|
Compare(strA, strB) | Сравнение строк (0=равны, <0 — первая меньше, >0 — больше). Есть перегрузка с ignoreCase. |
Concat(str0, str1, ...) | Конкатенация строк |
Contains(value) | Содержит ли строка подстроку |
Copy(str) | Создаёт копию строки |
EndsWith(value) | Заканчивается ли на подстроку |
Equals(value) | Равенство строк (перегрузка Object.Equals) |
Format(format, args) | Форматирование (как string.Format) |
IndexOf(value) | Индекс первого вхождения символа/подстроки (-1 если нет) |
LastIndexOf(value) | Индекс последнего вхождения |
Insert(startIndex, value) | Вставка подстроки в позицию |
IsNullOrEmpty(value) | Проверка на null или пустую строку |
IsNullOrWhiteSpace(value) | Проверка на null, пустую или только пробелы |
Join(separator, array) | Объединение массива строк с разделителем |
Remove(startIndex[, count]) | Удаление символов |
Replace(old, new) | Замена всех вхождений символа/подстроки |
Split(separator[, count]) | Разделение на подстроки по разделителю |
StartsWith(value) | Начинается ли с подстроки |
Substring(startIndex[, length]) | Извлечение подстроки |
ToCharArray() | Массив символов |
ToLower() / ToUpper() | Приведение к нижнему/верхнему регистру |
Trim() / TrimStart() / TrimEnd() | Удаление пробелов по краям |
Примеры использования
Сравнение строк
string s1 = "Test", s2 = "Text";
int cmp = String.Compare(s1, s2); // -1 (s1 < s2)
bool eq = s1.Equals(s2); // false
bool eqOrd = String.Equals(s1, s2, StringComparison.OrdinalIgnoreCase); // false
Проверка содержимого
string text = "This is test";
if (text.Contains("test")) Console.WriteLine("Found!");
Подстрока
string s = "Last night I dreamt of San Pedro";
string sub = s.Substring(23); // "San Pedro"
string sub2 = s.Substring(5, 5); // "night"
Объединение строк
string[] lines = { "Line 1", "Line 2", "Line 3" };
string joined = String.Join("\n", lines);
Разделение строки
string csv = "apple,banana,orange";
string[] fruits = csv.Split(','); // ["apple", "banana", "orange"]
StringBuilder — для эффективной конкатенации
Так как строки неизменяемы, повторная конкатенация в цикле создаёт много временных объектов. StringBuilder (в System.Text) решает это:
using System.Text;
var sb = new StringBuilder();
for (int i = 0; i < 1000; i++)
sb.Append(i).Append(' ');
string result = sb.ToString(); // одна аллокация
Лучшие практики
- Используйте интерполирование строк (
$"") вместо+иString.Format— читаемее и быстрее. - Для сборки больших строк в циклах —
StringBuilder. - Сравнивайте строки через
StringComparison.OrdinalилиOrdinalIgnoreCaseдля предсказуемого поведения (не зависят от культуры). - Проверяйте на null/пустоту через
string.IsNullOrEmpty/IsNullOrWhiteSpace. - Избегайте
ToUpper()/ToLower()для сравнения — используйтеStringComparison.
Язык C
- Классы и объекты в C#: Фундаменты надёжного ООП
- Строки в C#: основы, операции и продвинутые техники
- Освоение строк в Java: создание, методы и лучшие практики
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Строковые представления в Java Enums: настройка toString() и лучшие практики
- Функции строк в C++: strcpy, strcat, strlen, strcmp — практические примеры
- Строки в C просто: объявление, ввод, вывод и библиотечные функции
- Освоение строковых операций в Python: replace, join, split, reverse, преобразование регистра
- Класс String в Java: создание, манипуляции и основные методы
- Сериализация объектов в Java: сохранение и восстановление состояния