Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подсказка
Эта статья является частью раздела "Основы" для разработчиков , которые уже знают хотя бы один язык программирования и учат C#. Если вы не знакомы с программированием, сначала начните с учебных пособий по началу работы.
Исходя из Java или C++? C# string — это неизменяемый ссылочный тип, основанный на String. UTF-16 — это кодировка в памяти, аналогичная String Java. В отличие от C/C++, строки не завершаются null и не распадаются на указатели.
Строка — это последовательность символов. В C# string — это ключевое слово языка для System.String типа. Каждый строковый литерал, который вы пишете, создает экземпляр System.String.
string и String
Ключевое string слово и String имя типа ссылаются на тот же тип. Они компилируются на идентичный промежуточный язык (IL).
// The 'string' keyword is an alias for System.String. The two are identical.
string a = "hello";
String b = "hello";
Console.WriteLine(a == b); // True
Console.WriteLine(typeof(string) == typeof(String)); // True
Предпочитайте ключевое string слово в собственном коде. Он согласуется с другими встроенными ключевыми словами типа (int, bool, ), doubleи он работает без using System; директивы.
Строки неизменяемы
Неизменяемое означает, что значение невозможно изменить после его создания. После создания stringне удается изменить его символы. Такие методы, как ToUpperInvariant, ReplaceSubstringи Trim возвращают новую строку, содержащую измененное значение. Исходный экземпляр остается неизменным.
string greeting = "hello";
// ToUpper returns a *new* string. The original is unchanged.
string shouted = greeting.ToUpperInvariant();
Console.WriteLine(greeting); // hello
Console.WriteLine(shouted); // HELLO
Так как строки неизменяемы, их можно безопасно использовать в методах и потоках. Эта неизменяемость объясняет, почему string тип ведет себя как тип значения в повседневном использовании, даже если это ссылочный тип.
При формировании строки из многих небольших фрагментов в цикле используйте StringBuilder, чтобы добавлять на месте и в итоге получить одну строку:
// For many sequential edits, StringBuilder avoids allocating a new string each time.
var builder = new StringBuilder();
for (int i = 1; i <= 3; i++)
{
builder.Append("item ").Append(i).Append(';');
}
string result = builder.ToString();
Console.WriteLine(result); // item 1;item 2;item 3;
Строковые литералы
C# предлагает четыре литеральные формы. Каждая форма подходит для разного содержимого. В качестве краткого руководства:
- Используйте обычные литералы для короткого простого текста с максимум несколькими экранирующими последовательностями.
- Используйте литералы verbatim если обратные косые скобки доминируют в содержимом, например Windows пути или шаблоны регулярных выражений.
- Используйте необработанные строковые литералы для многострочного или структурированного текста, например встроенных блоков JSON, SQL, XML или форматированных сообщений.
-
$Добавьте префикс к любому из вышеупомянутых строковых литералов, чтобы получить интерполируемую строку, когда потребуется встроить значения. -
u8Добавьте суффикс в литерал для создания последовательности байтов UTF-8 (aReadOnlySpan<T>)byteдля байтовых API. Подробные сведения см. в разделе строковые литералы UTF-8 справочника по языку.
Обычные литералы и экранирующие последовательности
Обычный строковый литерал заключён в двойные кавычки. Обратная косая черта запускает escape-последовательность:
// Common escape sequences inside a regular string literal.
string tabbed = "name:\tAda"; // \t tab
string twoLines = "line 1\nline 2"; // \n newline
string quoted = "She said \"hi\"."; // \" literal quote
string path = "C:\\src\\app"; // \\ literal backslash
Console.WriteLine(tabbed);
Console.WriteLine(twoLines);
Console.WriteLine(quoted);
Console.WriteLine(path);
Распространённые экранирующие последовательности включают \n (новая строка), \t (табуляция), \" (литеральная кавычка), \\ (литеральная обратная косая черта), \0 (нулевой символ) и экранирующие последовательности Unicode (\uXXXX, \UXXXXXXXX).
Начиная с C# 13, \e представляет символ элемента управления ESC (U+001B). Это начальный байт для escape-последовательностей терминала ANSI:
// Beginning in C# 13, \e represents the ESC control character (U+001B).
// It's used to start ANSI terminal escape sequences.
string esc = "\e[31mError\e[0m: file missing";
Console.WriteLine(esc); // ESC[31mError ESC[0m: file missing
Console.WriteLine((int)'\e'); // 27
Используйте обычный литерал, если текст короткий и содержит только несколько escape-последовательностей. Когда экранирующих последовательностей становится больше, чем видимых символов, переключитесь на дословный или сырой литерал.
Дословные литералы
Дословный литерал имеет префикс @. Обратные слэши интерпретируются буквально, что полезно для путей Windows и шаблонов регулярных выражений:
// A verbatim string literal (@) treats backslashes literally.
// Useful for Windows paths and regular expressions.
string winPath = @"C:\src\app\readme.md";
string pattern = @"\d{3}-\d{4}";
Console.WriteLine(winPath);
Console.WriteLine(pattern);
Чтобы внедрить литеральные кавычки в строку подробных данных, дважды выполните следующие действия: @"She said ""hi""." Дословные строки также могут занимать несколько физических строк.
Подробные литералы являются правильным выбором, когда обратные косые скобки являются частью содержимого, но у вас нет много внедренных кавычки. Для многострочного текста или содержимого с кавычками необработанные строковые литералы обычно более понятны.
Необработанные строковые литералы
Для любого литерала, содержащего кавычки, обратные очки или несколько строк, предпочитают необработанные строковые литералы. Они полностью устраняют шум экранирования, что делает их наиболее подходящим для встроенных шаблонов JSON, SQL, XML, regex и отформатированных текстовых блоков, где источник должен выглядеть как выходные данные:
// Raw string literals use three or more quotes and need no escaping.
// The source looks like the output, which is ideal for inline JSON, SQL, XML, and the like.
string json = """
{
"name": "Ada",
"roles": ["admin", "editor"]
}
""";
string sql = """
SELECT Id, Name
FROM Users
WHERE Name = 'O''Brien'
""";
Console.WriteLine(json);
Console.WriteLine(sql);
Сырые строковые литералы практически полностью устраняют необходимость в экранирующих последовательностях и поддерживают любое необходимое форматирование и использование кавычек. Полные правила см. в разделе Необработанные строковые литералы.
Интерполированные строки
Префикс $ преобразует литерал в интерполированную строку. Выражения в {} отверстиях вычисляются и вставляются их результаты, и вы можете применить стандартные описатели формата и выравнивание внутри отверстий. Интерполяция также сочетается с другими литеральными формами — используйте $@"..." для интерполяции дословного литерала или $"""...""" для интерполяции необработанного строкового литерала для вывода с расширенным форматированием:
// The $ prefix evaluates expressions inside { } and inserts their values.
string name = "Ada";
int score = 92;
string greeting = $"Hello, {name}! Your score is {score}.";
// Format specifiers and alignment work inside the holes.
string formatted = $"pi = {Math.PI:F3}, padded = |{name,10}|";
// Combine $ and """ for richly formatted multiline output.
string report = $"""
Report for {name}
-----------------
Score : {score}
Grade : {(score >= 90 ? "A" : "B")}
""";
Console.WriteLine(greeting);
Console.WriteLine(formatted);
Console.WriteLine(report);
Интерполяция — это рекомендуемый способ создания строк из значений в повседневном коде.
Индексирование и char
А string — это последовательность единиц кода UTF-16. Индексатор возвращает один System.Char, представляющий одну единицу кода UTF-16, а не полную кодовую точку Юникода.
Length возвращает количество единиц кода.
// A string is a sequence of UTF-16 code units. s[i] returns one char.
string word = "café";
Console.WriteLine(word.Length); // 4
Console.WriteLine(word[0]); // c
foreach (char c in word)
{
Console.Write($"{c} "); // c a f é
}
Console.WriteLine();
Для текста, который может содержать эмодзи или символы за пределами базовой многоязычной плоскости, выполняйте итерацию по rune с использованием Rune или по графемным кластерам с использованием StringInfo. Простая char итерация подходит для большинства западноевропейских текстов и контента, в котором преобладают символы ASCII.
Равенство строк
При проверке на равенство с помощью string сравниваются последовательности символов, а не ссылки:
// String equality compares character sequences, not references.
string left = "hello";
string right = string.Concat("hel", "lo");
Console.WriteLine(left == right); // True
Console.WriteLine(left.Equals(right, StringComparison.Ordinal)); // True
Для сравнений, которые должны учитывать языковые параметры или регистр, передайте явное значение StringComparison. Используется StringComparison.Ordinal для значений протокола, идентификаторов и других нелингвистических текстов.
Общие строковые операции
Используйте следующую таблицу как краткое руководство по повседневным операциям со строками в C#:
| Категория | Что он охватывает |
|---|---|
| Search | Находить символы или подстроки, проверять префиксы и суффиксы |
| Разбивка | Разбить строку на подстроки по разделителям |
| Объединить | Объединение строк — +интерполяция, ConcatJoin |
| Modify | Создание преобразованной копии — Replace, TrimSubstring |
| Сравнить | Проверка равенства и упорядочения с правом StringComparison |
Полная поверхность API — каждая перегрузка, каждый метод — задокументирована в справочнике String .