Строки в Си Шарп. Строки в C#_теория. Символы и строки в C#
Скачать 338 Kb.
|
СИМВОЛЫ И СТРОКИ в C# Обработка текстовой информации является одной из самых распространенных задач современного программирования. С# предоставляет для ее решения широкий набор средств: символы char, неизменяемые строки string и изменяемые строки StringBuider. В данном разделе мы рассмотрим работу с символами, неизменяемыми и изменяемыми строками. Символы char Тип char предназначен для хранения символа в кодировке Unicode. Замечание. Кодировка Unicode является двухбайтной, т.е. каждый символ представлен двумя байтами, а не одним, как это сделано кодировке ASCII, используемой в ОС Windows. Из-за этого могут возникать некоторые проблемы, если вы решите, например, работать посимвольно с файлами, созданными в стандартном текстовом редакторе Блокнот. Символьный тип относится к встроенным типам данных С# и соответствует стандартному классу Сhar библиотеки .Net из пространства имен System. Строковый тип string Тип string, предназначенный для работы со строками символов в кодировке Unicode, является встроенным типом С#. Ему соответствует базовый тип класса System.String библиотеки .Net. Тип string относится к ссылочным типам. Существенной особенностью данного класса является то, что каждый его объект – это неизменяемая (immutable) последовательность символов Unicode. Любое действие со строкой ведет к тому, что создается копия строки, в которой и выполняются все изменения. Исходная же строка не меняется. Такой подход к работе со строками может показаться странным, но он обусловлен необходимостью сделать работу со строками максимально быстрой и безопасной. Создать объект типа string можно несколькими способами: Замечание. В примерах 1-4 используется неявный вызов конструктора. В примерах 5-7 конструктор вызывается явным образом через использование операции new. С объектом типа string можно работать посимвольно, т.е поэлементно. Рассмотрим пример программы, в которой задается строка и подсчитывается количество букв (символов) 'о' в этой строке. class Program { static void Main() { string a ="кол около колокола"; Console.WriteLine("Дана строка: {0}", a); char b='о'; int k=0; for (int x=0;x { if (a[x]==b) { k++; } } Console.WriteLine("Символ {0} содержится в ней {1} раз", b, k ); Console.ReadLine(); } } Результат работы программы: Дана строка: кол около колокола Символ о содержится в ней 7 раз Задание. Измените данную программу так, чтобы она запрашивала с клавиатуры исходную строку и символ, количество которых нужно определить. Если символа нет, то программа должна вывести сообщение «Символ не найден». Изменим исходную задачу. Пусть теперь нужно заменить все символы о на букву а. Попытка заменить в данной строке все вхождения буквы о на букву а (см. код ниже) ожидаемого результата не даст: for (int x=0;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 обладает богатым набором методов для сравнения строк, поиска в строке и других действий со строками. Рассмотрим эти методы.
Замечание. Напоминаем, что вызов статических методов происходит через обращение к имени класса, например, 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.Remove(0,4); Console.WriteLine("Cтрока a: {0}", a); Результат работы программы: Строка а: кол около колокола Строка а: около колокола В этом случае будет потеряна ссылка на исходное строковое значение "кол около колокола", хотя оно и будет занимать память. Освободить занятую память сможет только сборщик мусора. Рассмотрим следующий фрагмент программы: string a=""; for (int i = 1; i <= 100; i++) { a +="!"; } Console.WriteLine(a); В этом случае в памяти компьютера будет сформировано 100 различных строк вида: ! !! !!! … !!!...!! И только на последнюю из них будет ссылаться переменная а. Ссылки на все остальные строчки будут потеряны, но, как и в предыдущем примере, эти строки будут храниться в памяти компьютера и засорять ее. Бороться с таким засорением придется сборщику мусора, что будет сказываться на производительности программы. Рассмотренные примеры определяют область применения типа string – это поиск, сравнение, извлечение информации из строки. А вот если нужно изменять строку, то лучше пользоваться классом StringBuilder. Подробнее о методах работы со строкам типа string см. С. Фролов «Самоучитель по C#» Глава 12. Работа с текстовыми строками. Стр. 368-405. Пример. Приведенная ниже программа вводит строку символов с клавиатуры и формирует новую строку, в которой символы введенной строки переписаны в обратном порядке. class Program { static void Main(string[] args) { string str; //описываем исходную строку str string str1=""; //описываем cтроку-результат str1 и задаем // ей начальное значение – пустая строка Console.Write("Введите строку "); str = Console.ReadLine(); //вводим строку с клавиатуры int i; string bukva; for (i = 0; i < str.Length; i++) { bukva = str.Substring(i, 1); // выделяем один символ из строки str1 = bukva + str1; // добавляем этот символ к новой строке слева } Console.WriteLine("\nНовая строка = "+str1); //выводим результат Console.Read(); } } } Задание. Измените данную программу так, чтобы она проверяла, является ли введенное слово (фраза) палиндромом (т.е. читается одинаково слева направо и справа налево. Примеры палиндромов – ТОПОТ, РОТОР, ШАЛАШ … ). |