- Строки (Руководство по программированию на C#) Strings (C# Programming Guide)
- Сравнение строки и System.String string vs. System.String
- Объявление и инициализация строк Declaring and Initializing Strings
- Неизменность строковых объектов Immutability of String Objects
- Регулярные и буквальные строковые литералы Regular and Verbatim String Literals
- Escape-последовательности строк String Escape Sequences
- Строки формата Format Strings
- Интерполяция строк String Interpolation
- Составное форматирование Composite Formatting
- Подстроки Substrings
- Доступ к отдельным символам Accessing Individual Characters
- Строки NULL и пустые строки Null Strings and Empty Strings
- Использование класса StringBuilder для быстрого создания строк Using StringBuilder for Fast String Creation
- Строки, методы расширения и LINQ Strings, Extension Methods and LINQ
Строки (Руководство по программированию на C#) Strings (C# Programming Guide)
Строка — это объект типа String, значением которого является текст. A string is an object of type String whose value is text. Внутри программы текст хранится в виде упорядоченной коллекции объектов Char только для чтения. Internally, the text is stored as a sequential read-only collection of Char objects. В конце строки C# нет нуль-символов. Поэтому строка C# может содержать любое число внедренных нуль-символов (‘\0’). There is no null-terminating character at the end of a C# string; therefore a C# string can contain any number of embedded null characters (‘\0’). Свойство Length строки соответствует числу содержащихся в ней объектов Char , но не числу символов Юникода. The Length property of a string represents the number of Char objects it contains, not the number of Unicode characters. Для доступа к отдельным кодовым точкам Юникода в строке используйте объект StringInfo. To access the individual Unicode code points in a string, use the StringInfo object.
Сравнение строки и System.String string vs. System.String
В C# ключевое слово string является псевдонимом для String. In C#, the string keyword is an alias for String. Таким образом, String и string эквивалентны, их можно использовать независимо от используемого соглашения об именовании. Therefore, String and string are equivalent, and you can use whichever naming convention you prefer. Класс String предоставляет множество методов для безопасного создания, обработки и сравнения строк. The String class provides many methods for safely creating, manipulating, and comparing strings. Кроме того, язык C# перегружает некоторые операторы для упрощения типичных операций со строками. In addition, the C# language overloads some operators to simplify common string operations. Дополнительные сведения о ключевых словах см. в статье, посвященной строкам. For more information about the keyword, see string. Дополнительные сведения о типе и его методах см. здесь: String. For more information about the type and its methods, see String.
Объявление и инициализация строк Declaring and Initializing Strings
Вы можете объявлять и инициализировать строки различными способами, как показано в следующем примере: You can declare and initialize strings in various ways, as shown in the following example:
Обратите внимание, что вы не используете оператор new для создания объекта строки, за исключением случаев инициализации строки с помощью массива символов. Note that you do not use the new operator to create a string object except when initializing the string with an array of chars.
Инициализируйте строку с константным значением Empty для создания нового объекта String, строка которого имеет нулевую длину. Initialize a string with the Empty constant value to create a new String object whose string is of zero length. Представлением строкового литерала строки с нулевой длиной является «». The string literal representation of a zero-length string is «». Если вы инициализируете строки со значением Empty вместо NULL, вы снизите вероятность появления исключения NullReferenceException. By initializing strings with the Empty value instead of null, you can reduce the chances of a NullReferenceException occurring. Используйте статический метод IsNullOrEmpty(String), чтобы проверить значение строки, прежде чем пытаться получить к ней доступ. Use the static IsNullOrEmpty(String) method to verify the value of a string before you try to access it.
Неизменность строковых объектов Immutability of String Objects
Строковые объекты являются неизменяемыми: их нельзя изменить после создания. String objects are immutable: they cannot be changed after they have been created. Может показаться, что все методы String и операторы C# изменяют строку, но в действительности они возвращают результаты в новый строковый объект. All of the String methods and C# operators that appear to modify a string actually return the results in a new string object. Когда содержимое s1 и s2 объединяется для формирования одной строки, две исходные строки не изменяются, как показано в следующем примере. In the following example, when the contents of s1 and s2 are concatenated to form a single string, the two original strings are unmodified. Оператор += создает новую строку, которая содержит объединенное содержимое. The += operator creates a new string that contains the combined contents. Этот новый объект присваивается переменной s1 , а исходный объект, который был присвоен s1 , освобождается для сборки мусора, так как ни одна переменная не ссылается на него. That new object is assigned to the variable s1 , and the original object that was assigned to s1 is released for garbage collection because no other variable holds a reference to it.
Так как «изменение» строки на самом деле является созданием новой строки, создавать ссылки на строки следует с осторожностью. Because a string «modification» is actually a new string creation, you must use caution when you create references to strings. Если вы создадите ссылку на строку, а затем «измените» исходную строку, ссылка будет по-прежнему указывать на исходный объект, а не на новый объект, который был создан при изменении строки. If you create a reference to a string, and then «modify» the original string, the reference will continue to point to the original object instead of the new object that was created when the string was modified. Это поведение проиллюстрировано в следующем коде: The following code illustrates this behavior:
Сведения о создании новых строк, основанных на таких изменениях, как операции поиска и замены исходной строки, см. в инструкциях по изменению содержимого строки. For more information about how to create new strings that are based on modifications such as search and replace operations on the original string, see How to modify string contents.
Регулярные и буквальные строковые литералы Regular and Verbatim String Literals
Используйте регулярные строковые литералы, когда вам нужно внедрить escape-символы, доступные в C#, как показано в следующем примере: Use regular string literals when you must embed escape characters provided by C#, as shown in the following example:
Буквальные строковые литералы используются для удобства и читабельности, если текст строки содержит символы обратной косой черты, например в путях к файлам. Use verbatim strings for convenience and better readability when the string text contains backslash characters, for example in file paths. Так как буквальные строки сохраняют символы новой строки как часть текста строки, их можно использовать для инициализации многострочных строк. Because verbatim strings preserve new line characters as part of the string text, they can be used to initialize multiline strings. Используйте двойные кавычки, чтобы вставить кавычки в буквальной строке. Use double quotation marks to embed a quotation mark inside a verbatim string. В следующем примере показаны наиболее часто используемым буквальные строки: The following example shows some common uses for verbatim strings:
Escape-последовательности строк String Escape Sequences
Escape-последовательность Escape sequence | Имя символа Character name | Кодировка Юникод Unicode encoding |
---|---|---|
\’ \’ | Одинарная кавычка Single quote | 0x0027 0x0027 |
\» \» | Двойная кавычка Double quote | 0x0022 0x0022 |
\\ | Обратная косая черта Backslash | 0x005C 0x005C |
\0 \0 | Null Null | 0x0000 0x0000 |
\a \a | Предупреждение Alert | 0x0007 0x0007 |
\b \b | Backspace Backspace | 0x0008 0x0008 |
\f \f | Перевод страницы Form feed | 0x000C 0x000C |
\n \n | Новая строка New line | 0x000A 0x000A |
\r \r | Возврат каретки Carriage return | 0x000D 0x000D |
\t \t | Горизонтальная табуляция Horizontal tab | 0x0009 0x0009 |
\v \v | Вертикальная табуляция Vertical tab | 0x000B 0x000B |
\u \u | Escape-последовательность Юникода (UTF-16) Unicode escape sequence (UTF-16) | \uHHHH (диапазон: 0000–FFFF; пример: \u00E7 = «ç») \uHHHH (range: 0000 — FFFF; example: \u00E7 = «ç») |
\U \U | Escape-последовательность Юникода (UTF-32) Unicode escape sequence (UTF-32) | \U00HHHHHH (диапазон: 000000–10FFFF; пример: \U0001F47D = «👽») \U00HHHHHH (range: 000000 — 10FFFF; example: \U0001F47D = «👽») |
\x \x | Escape-последовательность Юникода аналогична «\u», она отличается только длиной переменной Unicode escape sequence similar to «\u» except with variable length | \xH[H][H][H] (диапазон: 0–FFFF; пример: \x00E7 или \x0E7 или \xE7 = «ç») \xH[H][H][H] (range: 0 — FFFF; example: \x00E7 or \x0E7 or \xE7 = «ç») |
Если вы используете escape-последовательность \x с менее чем четырьмя шестнадцатеричными цифрами, то когда непосредственно следующие за ней символы также являются допустимыми шестнадцатеричными цифрами (т. е. 0–9, A–F и a–f), они будут интерпретированы как часть этой escape-последовательности. When using the \x escape sequence and specifying less than 4 hex digits, if the characters that immediately follow the escape sequence are valid hex digits (i.e. 0-9, A-F, and a-f), they will be interpreted as being part of the escape sequence. Например, \xA1 дает результат «¡», являющийся кодовой точкой U+00A1. For example, \xA1 produces «¡», which is code point U+00A1. Однако если следующий символ — «A» или «a», тогда escape-последовательность будет интерпретироваться как \xA1A и даст результат «ਚ», являющийся кодовой точкой U+0A1A. However, if the next character is «A» or «a», then the escape sequence will instead be interpreted as being \xA1A and produce «ਚ», which is code point U+0A1A. В таких случаях, чтобы избежать некорректной интерпретации, указывайте все четыре шестнадцатеричных знака (например, \x00A1 ). In such cases, specifying all 4 hex digits (e.g. \x00A1 ) will prevent any possible misinterpretation.
Во время компиляции буквальные строки преобразуются в обычные строки с теми же escape-последовательностями. At compile time, verbatim strings are converted to ordinary strings with all the same escape sequences. Поэтому, если вы просматриваете буквальную строку в окне контрольных значений отладчика, вы увидите escape-символы, добавленные компилятором, а не буквальную версию из исходного кода. Therefore, if you view a verbatim string in the debugger watch window, you will see the escape characters that were added by the compiler, not the verbatim version from your source code. Например, буквальная строка @»C:\files.txt» будет отображаться в окне контрольных значений как «C:\\files.txt». For example, the verbatim string @»C:\files.txt» will appear in the watch window as «C:\\files.txt».
Строки формата Format Strings
Строка формата — это строка, содержимое которой можно определить динамически во время выполнения. A format string is a string whose contents are determined dynamically at runtime. Строки формата создаются путем внедрения интерполированных выражений или заполнителей внутри фигурных скобок в строке. Format strings are created by embedding interpolated expressions or placeholders inside of braces within a string. Весь код внутри фигурных скобок ( <. >) будет преобразован в значение и выходные данные как отформатированная строка во время выполнения. Everything inside the braces ( <. >) will be resolved to a value and output as a formatted string at runtime. Существует два способа создания строк формата: интерполяция строк и составное форматирование. There are two methods to create format strings: string interpolation and composite formatting.
Интерполяция строк String Interpolation
В C# 6.0 и более поздних версий интерполированные строки определяются по специальному символу $ . Они включают интерполированные выражения в фигурных скобках. Available in C# 6.0 and later, interpolated strings are identified by the $ special character and include interpolated expressions in braces. См. дополнительные сведения в интерактивном руководстве по интерполяции строк в C#. If you are new to string interpolation, see the String interpolation — C# interactive tutorial for a quick overview.
Используйте интерполяцию для повышения удобства чтения и обслуживаемости кода. Use string interpolation to improve the readability and maintainability of your code. Интерполяция строк позволяет достичь тех же результатов, что и использование метода String.Format , но более простым и понятным способом. String interpolation achieves the same results as the String.Format method, but improves ease of use and inline clarity.
Составное форматирование Composite Formatting
String.Format использует заполнители в фигурных скобках, чтобы создать строку формата. The String.Format utilizes placeholders in braces to create a format string. В этом примере результат аналогичен выходным данным, получаемым с помощью метода интерполяции строк, описанного выше. This example results in similar output to the string interpolation method used above.
См. дополнительные сведения о типах форматирования в .NET. For more information on formatting .NET types see Formatting Types in .NET.
Подстроки Substrings
Подстрока — это последовательность символов, содержащихся в строке. A substring is any sequence of characters that is contained in a string. Используйте метод Substring, чтобы создать новую строку из части исходной строки. Use the Substring method to create a new string from a part of the original string. Одно вхождение подстроки или несколько можно найти с помощью метода IndexOf. You can search for one or more occurrences of a substring by using the IndexOf method. Используйте метод Replace, чтобы заменить все вхождения указанной подстроки новой строкой. Use the Replace method to replace all occurrences of a specified substring with a new string. Как и метод Substring, метод Replace фактически возвращает новую строку и не изменяет исходную строку. Like the Substring method, Replace actually returns a new string and does not modify the original string. См. дополнительные сведения о поиске строк и изменении содержимого строк. For more information, see How to search strings and How to modify string contents.
Доступ к отдельным символам Accessing Individual Characters
Используя нотацию массива со значением индекса, можно получить доступ только для чтения к отдельным символам, как показано в следующем примере: You can use array notation with an index value to acquire read-only access to individual characters, as in the following example:
Если вам необходимо изменить отдельные символы в строке и функций методов String вам недостаточно, используйте объект StringBuilder, чтобы изменить отдельные символы «на месте», а затем создайте новую строку для сохранения результатов с помощью методов StringBuilder. If the String methods do not provide the functionality that you must have to modify individual characters in a string, you can use a StringBuilder object to modify the individual chars «in-place», and then create a new string to store the results by using the StringBuilder methods. В следующем примере предположим, что необходимо определенным образом изменить исходную строку, а затем сохранить результаты для дальнейшего использования: In the following example, assume that you must modify the original string in a particular way and then store the results for future use:
Строки NULL и пустые строки Null Strings and Empty Strings
Пустая строка — это экземпляр объекта System.String, который содержит нуль символов. An empty string is an instance of a System.String object that contains zero characters. Пустые строки часто используются в различных сценариях программирования для представления пустого текстового поля. Empty strings are used often in various programming scenarios to represent a blank text field. Вы можете вызывать методы для пустых строк, так как они являются допустимыми объектами System.String. You can call methods on empty strings because they are valid System.String objects. Пустые строки инициализируются следующим образом: Empty strings are initialized as follows:
В отличие от пустых строк строка NULL не ссылается на экземпляр объекта System.String, поэтому любая попытка вызвать метод для строки NULL приводит к исключению NullReferenceException. By contrast, a null string does not refer to an instance of a System.String object and any attempt to call a method on a null string causes a NullReferenceException. Но вы можете использовать строки NULL в операциях объединения и сравнения с другими строками. However, you can use null strings in concatenation and comparison operations with other strings. В следующих примерах показаны случаи, в которых ссылка на строку NULL вызывает и не вызывает исключение: The following examples illustrate some cases in which a reference to a null string does and does not cause an exception to be thrown:
Использование класса StringBuilder для быстрого создания строк Using StringBuilder for Fast String Creation
Операции со строками в .NET хорошо оптимизированы, и в большинстве случаев они не снижают производительность. String operations in .NET are highly optimized and in most cases do not significantly impact performance. Но в некоторых сценариях, например в сплошных циклах, которые выполняются сотни и тысячи раз, операции со строками могут повлиять на производительность. However, in some scenarios such as tight loops that are executing many hundreds or thousands of times, string operations can affect performance. Класс StringBuilder создает строковый буфер, который ускоряет работу, если программа выполняет много операций над строками. The StringBuilder class creates a string buffer that offers better performance if your program performs many string manipulations. Строка StringBuilder также позволяет заново присваивать отдельные символы, что не поддерживает встроенный строковый тип данных. The StringBuilder string also enables you to reassign individual characters, something the built-in string data type does not support. Например, этот код изменяет содержимое строки без создания новой строки: This code, for example, changes the content of a string without creating a new string:
В этом примере объект StringBuilder используется для создания строки из набора числовых типов: In this example, a StringBuilder object is used to create a string from a set of numeric types:
Строки, методы расширения и LINQ Strings, Extension Methods and LINQ
Так как тип String использует IEnumerable , вы можете применять методы расширения, определенные для строк в классе Enumerable. Because the String type implements IEnumerable , you can use the extension methods defined in the Enumerable class on strings. Чтобы избежать визуального загромождения, эти методы исключены из IntelliSense для типа String, но все равно доступны. To avoid visual clutter, these methods are excluded from IntelliSense for the String type, but they are available nevertheless. Можно также использовать выражения запроса LINQ в строках. You can also use LINQ query expressions on strings. Дополнительные сведения см. в документации по LINQ и строкам. For more information, see LINQ and Strings.