Тип string, предназначенный для работы со строками символов в кодировке Unicode, является встроенным типом С#. Ему соответствует базовый тип класса System.String библиотеки .Net. Тип string относится к ссылочным типам.
Существенной особенностью данного класса является то, что каждый его объект – это неизменяемая (immutable) последовательность символов Unicode. Любое действие со строкой ведет к тому, что создается копия строки, в которой и выполняются все изменения. Исходная же строка не меняется. Такой подход к работе со строками может показаться странным, но он обусловлен необходимостью сделать работу со строками максимально быстрой и безопасной. Например, при наличии нескольких одинаковых строк CLR может хранить их по одному и тому же адресу (данный механизм называется stringinterning), экономя таким образом память.
Создать объект типа string можно несколькими способами:
1) string s; // инициализация отложена
2) string s=''кол около колокола''; //инициализация строковым литералом
3) string s=@''Привет!
Сегодня хорошая погода!!!''
//символ @ сообщает конструктору string, что строку
// нужно воспринимать буквально, даже
// если она занимает несколько строк
4) int x = 12344556; //инициализировали целочисленную переменную
string s=x.ToString(); //преобразовали ее к типу string
5) string s=new string (' ', 20); //конструктор создает строку из 20 пробелов
6) char [] a={'a', 'b', 'c', 'd', 'e'}; //создали массив символов
string v=new string (a); //создание строки из массива символов
7) char [] a={'a', 'b', 'c', 'd', 'e'};
string v=new string (a, 0, 2);
// создание строки из части массива символов, при
// этом: 0 показывает с какого символа, 2 – сколько
// символов использовать для инициализации
Замечание. В примерах 1-4 используется неявный вызов конструктора. В примерах 5-7 конструктор вызывается явным образом через использование операции new.
С объектом типа string можно работать посимвольно, т.е поэлементно:
static void Main()
{
string a = "кол около колокола";
Console.WriteLine("Дана строка: {0}", a);
char b = 'о';
int k = 0;
for (int x = 0; x < a.Length; x++)
{
if (a[x] == b)
{
k++;
}
}
Console.WriteLine("Символ {0} содержится в ней {1} раз", b, k);
}
|
Результат работы программы:
Дана строка: кол около колокола
Символ о содержится в ней 7 раз
Однако при попытке заменить в данной строке все вхождения буквы о на букву а, ожидаемого результата мы не получим:
for (int x = 0; x < a.Length; x++)
{
if (a[x] == b)
{
a[x] = c; //1
}
}
|
Относительно строки 1 компилятор выдаст сообщение об ошибке:
Property or indexer string.this[int] cannot be assigned to – it is read only
Тем самым компилятор запрещает напрямую изменять значение строки.
Класс string обладает богатым набором методов для сравнения строк, поиска в строке и других действий со строками. Рассмотрим эти методы.
Название |
Вид |
Описание |
Compare |
Статический метод |
Сравнение двух строк в лексикографическом (алфавитном) порядке. Разные реализации метода позволяют сравнивать строки с учетом или без учета регистра. |
CompareTo |
Экземплярный метод |
Сравнение текущего экземпляра строки с другой строкой. |
Concat |
Статический метод |
Слияние произвольного числа строк. |
Copy |
Статический метод |
Создание копии строки. |
Empty |
Статическое поле |
Открытое статическое поле, представляющее пустую строку. |
Format |
Статический метод |
Форматирование строки в соответствии с заданным форматом. |
IndexOf, LastIndexOf |
Экземплярные методы |
Определение индекса первого или, соответственно, последнего вхождения подстроки в данной строке. |
IndexOfAny,
LastIndexOfAny |
Экземплярные методы |
Определение индекса первого или, соответственно, последнего вхождения любого символа из подстроки в данной строке. |
Insert |
Экземплярный метод |
Вставка подстроки в заданную позицию. |
Join |
Статический метод |
Слияние массива строк в единую строку. Между элементами массива вставляются разделители. |
Length |
Свойство |
Возвращает длину строки. |
PadLeft, PadRigth |
Экземплярные методы |
Выравнивают строки по левому или, соответственно, правому краю путем вставки нужного числа пробелов в начале или в конце строки. |
Remove |
Экземплярный метод |
Удаление подстроки из заданной позиции. |
Replace |
Экземплярный метод |
Замена всех вхождений заданной подстроки или символа новыми подстрокой или символом. |
Split |
Экземплярный метод |
Разделяет строку на элементы, используя разные разделители. Результаты помещаются в массив строк. |
StartWith, EndWith |
Экземплярные методы |
Возвращают true или false в зависимости от того, начинается или заканчивается строка заданной подстрокой. |
Substring |
Экземплярный метод |
Выделение подстроки, начиная с заданной позиции. |
ToCharArray |
Экземплярный метод |
Преобразует строку в массив символов. |
ToLower, ToUpper |
Экземплярные методы |
Преобразование строки к нижнему или, соответственно, к верхнему регистру. |
Trim, TrimStart, TrimEnd |
Экземплярные методы |
Удаление пробелов в начале и конце строки или только с начала или только с конца соответственно. |
Замечание. Напоминаем, что вызов статических методов происходит через обращение к имени класса, например, String.Concat(str1, str2), а обращение к экземплярым методам через объекты (экземпляры класса), например, str.ToLower().
Обратите внимание на то, что все методы возвращают ссылку на новую строку, созданную в результате преобразования копии исходной строки. Для того чтобы сохранить данное преобразование, нужно установить на него новую ссылку. Например, если выполнить следующий фрагмент программы:
string a = "кол около колокола";
Console.WriteLine("Строка а: {0}", a);
a.Remove(0, 4);
Console.WriteLine("Строка a: {0}", a);
|
Результат работы программы:
Cтрока a: кол около колокола
Cтрока a: кол около колокола
то компилятор никаких сообщений не выдаст, но мы не увидим никаких преобразований со строкой.
А вот в результате работы следующего фрагмента программы мы получим следующий результат:
string a = "кол около колокола";
Console.WriteLine("Cтрока a: {0}", a);
string b = a.Remove(0, 4);
Console.WriteLine("Cтрока a: {0}", a);
Console.WriteLine("Cтрока b: {0}", b);
|
Результат работы программы:
Строка а: кол около колокола
Строка а: кол около колокола
Строка b: около колокола
Результат выполнения метода Remove, можно записать и в саму переменную a:
string a = "кол около колокола";
Console.WriteLine("Cтрока a: {0}", a);
a = a.Remove(0, 4);
Console.WriteLine("Cтрока a: {0}", a);
|
Результат работы программы:
Строка а: кол около колокола
Строка а: около колокола
В этом случае будет потеряна ссылка на исходное строковое значение "кол около колокола", хотя оно и будет занимать память. Освободить занятую память сможет только сборщик мусора.
Рассмотрим следующий фрагмент программы:
string a = "";
for (int i = 1; i <= 100; i++)
{
a += "!";
}
Console.WriteLine(a);
|
В этом случае в памяти компьютера будет сформировано 100 различных строк вида:
!
!!
!!!
…
!!!...!!
И только на последнюю из них будет ссылаться переменная а. Ссылки на все остальные строчки будут потеряны, но как и в предыдущем примере эти строки будут храниться в памяти компьютера и засорять ее. Боротся с таким засорением придется сборщику мусора, что будет сказываться на производительности программы.
|