This article has been localized into Russian by the community.
Тип String
Stringчасть текста. Это, как правило, состоит из 2 символов или более, так как если это только один, вы должны рассмотреть возможность использования вместо этого char. Однако строки также могут быть пустыми или даже нулевыми, так как это ссылочный Тип. Строка может быть объявлена так же, как и другие типы данных, с которыми мы уже работали:
string s;
Если вы сразу хотите присвоить ему значение:
string name = "John Doe";
Все между двойными кавычками в C# считается строкой, как в приведенном выше примере-окружение одного или нескольких символов между двойными кавычками-это просто то, как вы говорите компилятору, что материал между ним должен интерпретироваться как строка, а не, например, ключевые слова и команды.
Strings неизменна
В C# строки неизменяемы, что в основном означает, что после их создания они не могут быть изменены. Это, очевидно, не очень практично в повседневном использовании, поэтому framework помогает нам - вместо того, чтобы объявлять новые строки для внесения изменений, он просто создает новую строку для вас каждый раз, когда вы изменяете существующую. Это делает этот процесс бесшовным, но он также может сделать ваш код менее эффективным, даже не замечая его. Вот пример, чтобы проиллюстрировать это:
string numbers = "";
for (int i = 0; i < 10000; i++)
numbers += i.ToString();
В этом случае мы повторяем цикл 10.000 раз, каждый раз добавляя текущий индекс к строке. Благодаря только что полученным знаниям теперь известно, что вместо изменения существующей строки, включающей последний номер, создается новая строка, которая затем присваивается старой переменной, оставляя старое значение очищенным framework-ом. И это происходит 10.000 раз! Вместо этого обычно рекомендуется использовать так называемый StringBuilder, если известно, что строка будет строиться в течение нескольких операций:
StringBuilder numbers = new StringBuilder();
for (int i = 0; i < 10000; i++)
numbers.Append(i);
Console.WriteLine(numbers.ToString());
Основные строковые операции
При всем том, что о неизменных строках сказано, вы все равно найдете свой собственный способ манипулирования и работы с простыми строками, и не беспокойтесь, если вы не работаете внутри гигантского цикла, это, вероятно, не проблема! Вот некоторые из основных вещей, которые вы можете сделать со строками:
Вы можете concatenate (объединить) две или более строки, просто "добавляя" их (оператором "+"):
string name = "John" + " " + "Doe";
Конечно, вы можете сделать то же самое с переменными, где вы смешиваете строки с двойными кавычками и переменные, которые являются строками или которые могут быть превращены в строки (используя метод ToString (), определенный во всех объектам). Однако более "чистый" способ сделать это с помощью метода Format, определенного в классе String:
string name = "John Doe";
int age = 42;
string userString = String.Format("{0} is {1} years old and lives in {2}", name, age, "New York");
Обратите внимание, как я использую нумерованные заполнители ({0}, {1} и т. д.), а затем укажите значения для него в качестве параметров метода. Просто помните, что индексы и количество заполнителей должны соответствовать параметрам, которые вы передаете!
Свойство Length позволяет проверить текущую длину строки, например для целей проверки. Свойство Length также очень полезно в сочетании с другими свойствами и методами, например методы Substring() и IndexOf(). Метод Substring позволяет получить часть строки, а метод IndexOf позволяет найти первый индекс заданного символа / строки. Позвольте мне проиллюстрировать на примере:
string name = "John Doe";
int indexOfSpace = name.IndexOf(' ') + 1;
string lastName = name.Substring(indexOfSpace, name.Length - indexOfSpace);
Console.WriteLine(lastName);
Краткое объяснение: мы определяем имя, затем мы используем метод IndexOf (), чтобы найти первую позицию пробела. Затем мы используем метод Substring (), чтобы получить все после пробела, указав начальную позицию, а также длину.
Другим классным вспомогательным методом класса String является метод Replace (). Это позволяет вам взять строку, а затем запустить операцию поиска / замены на ней, как это:
string name = "John Doe";
Console.WriteLine(name.Replace("John", "Jane"));
Метод Replace() вовсе не строг - если искомая строка (первый параметр) отсутствует, то ничего не произойдет (исключения не выдаются или что-то в этом роде). Если он присутствует, он будет заменен вторым параметром. Вы можете применить метод Contains():
string name = "John Doe";
if (name.Contains("John"))
Console.WriteLine(name.Replace("John", "Jane"));
else
Console.WriteLine("John was not found!");
Иногда требуется узнать, начинается или заканчивается строка определенным символом или строкой. Для этого класс String может помочь вам методами StartsWith() и EndsWith(), которые работают так же, как указано в названии метода:
string name = "John Doe";
if ((name.StartsWith("John")) && (name.EndsWith("Doe")))
Console.WriteLine("Hello, Mr. Doe!");
Есть еще более классные Строковые методы, и способов их использования определенно больше, чем показано на этих коротких примерах. Если вы хотите знать больше об этом, посмотрите MSDN documentation for the String class.
Дословные Verbatim Strings & экранирование Escapе
При определении строки, вы скоро увидите, что некоторые символы имеют специальное назначение. Самый важный пример - это двойная кавычка, потому что, поскольку она используется для обозначения начала и конца строки компилятору, как вы можете использовать ее внутри своей строки? Самый простой ответ на это-экранирование, где вы сигнализируете компилятору, что специальный символ должен обрабатываться буквально вместо его обычной функции. Вот пример:
Console.WriteLine("What do you mean by \"Hello, world\" ??");
При запуске результат будет таким:
What do you mean by "Hello, world" ??
Другими словами, мы просто используем обратную косую черту перед двойной кавычкой, чтобы указать, что это не конец строки, но вместо этого мы действительно хотим двойную кавычку. Так... что, если мы действительно хотим обратную косую черту, а не просто использовать ее, чтобы избежать другого персонажа? Ну тогда вам придется экранировать это тоже другой обратной косой чертой:
Console.WriteLine("Right here \\ Right now");
Выводимый результат:
Right here \ Right now
Причина в том, что обратная косая черта используется не только для экранирования двойных кавычек - она также используется для префикса диапазона символов, чтобы дать им специальные значения. Например, \n-новая строка, \t-символ табуляции и так далее. Вы можете найти хороший список Escape-последовательностей here.
Дословные Verbatim строки
В качестве альтернативы всему этому экранированию можно использовать дословную строку. Это похоже на обычное объявление строки, но с префиксом@, и внутри него все символы обрабатываются буквально:
Console.WriteLine(@"In a verbatim string \ everything is literal: \n & \t");
Вывод будет выглядеть так же, как и ввод:
In a verbatim string \ everything is literal: \n & \t
Есть только одно исключение из этого правила: двойная кавычка все еще должна быть экранирована, но это имеет довольно хороший смысл, потому что в противном случае, как бы компилятор узнал, пытаетесь ли вы закончить строку или нет? Однако в дословной строке двойная кавычка экранируется не обратной косой чертой, а другой двойной кавычкой, например:
Console.WriteLine(@"What do you mean by ""Hello, world"" ??");
Результат выглядит так:
What do you mean by "Hello, world" ??
Резюме
Строки являются такой важной темой для всех программистов - вы, вероятно, будете делать какую-то обработку строк в течение большей части времени, которое вы потратили на написание кода. К счастью, в C# есть все инструменты, необходимые для этого, как я пытался проиллюстрировать в этой статье.