Г. Шилдт - Полный справочник по C# (1160789), страница 34
Текст из файла (страница 34)
Массивы и строки171СтрокиС точки зрения ежедневного программирования одним из самых важных типовданных С# является тип s t r i n g . Он предназначен для определения и поддержкисимвольных строк. Во многих других языках программирования строка представляетсобой массив символов. В С# дело обстоит иначе: здесь строки являются объектами.Таким образом, s t r i n g — это ссылочный тип. Несмотря на то что s t r i n g — встроенный тип данных, для его рассмотрения необходимо иметь представление о классахи объектах.На самом деле мы негласно используем класс s t r i n g , начиная с главы 2, но выпопросту об этом не знали.
При создании строкового литерала в действительностисоздается объект класса s t r i n g . Например, в инструкцииI Console.WriteLine("В С# строки являются объектами.");строка "В С# строки являются объектами." средствами языка С# автоматически превращена в объект класса s t r i n g . Таким образом, в предыдущих программах мы подспудно использовали класс s t r i n g . В этом разделе мы научимся работать с ними вявном виде.Создание строкСамый простой способ создать объект типа s t r i n g — использовать строковый литерал.
Например, после выполнения приведенной ниже инструкции s t r будет объявлена ссылочной переменной типа s t r i n g , которой присваивается ссылка на строковый литерал.1 s t r i n g s t r = "С#-строки - это мощная с и л а . " ;В данном случае переменная s t r инициализируется последовательностью символов "С#-строки - это мощная сила.".Можно также создать string-объект из массива типа char. Вот пример:fc h a r t ] charray = { f t f ,e \ 'sf,4'};s t r i n g s t r = new s t r i n g ( c h a r r a y ) ;IПосле создания string-объект можно использовать везде, где разрешается использование строки символов, заключенной в кавычки. Например, string-объектможно использовать в качестве аргумента функции WriteLine (), как показано в следующем примере.// Знакомство со строками.using System;class StringDemo {public static void Main() {chart] charray = {'A1, f \ ' s 1 , 't 1 , 'r 1 , f i ' , f n', •g 1 , '.' };string strl = new string(charray);string str2 = "Еще один string-объект.";Console.WriteLine(strl) ;Console.WriteLine(str2);172Часть I.
Язык С #Результаты выполнения этой программы таковы:A string.Еще один string-объект.Работа со строкамиКласс s t r i n g содержит ряд методов, которые предназначены для обработки строк(некоторые из них показаны в табл. 7.1). Тип s t r i n g также включает свойствоLength, которое содержит длину строки.Чтобы получить значение отдельного символа строки, достаточно использоватьиндекс. Например:string str = "test";Console.WriteLine(string[0]);IПри выполнении этого фрагмента программы на экран будет выведен символ t(первый символ слова "test"). Как и у массивов, индексация строк начинается с нуля.Однако здесь важно отметить, что с помощью индекса нельзя присвоить символувнутри строки новое значение.
Индекс можно использовать только для получениясимвола.Таблица 7.1. Наиболее часто используемые методы обработки строкs t a t i c string Copy (string s t r )Возвращает копию строки s t rintcompareTo ( s t r i n g str)Возвращает отрицательное значение, если вызывающая строка меньше строки s t r , положительное значение, если вызывающая строкабольше строки s t r , и нуль, если сравниваемые строки равныinti n d e x O f ( s t r i n g str)Выполняет в вызывающей строке поиск подстроки, заданной параметром s t r .
Возвращает индекс первого вхождения искомой подстроки или - 1 , если она не будет обнаруженаintLastindexOf ( s t r i n g s t r )Выполняет в вызывающей строке поиск подстроки, заданной параметром s t r . Возвращает индекс последнего вхождения искомойподстроки или - 1 , если она не будет обнаруженаs t r i n g ToLower ( )Возвращает строчную версию вызывающей строкиs t r i n g ToupperOВозвращает прописную версию вызывающей строкиЧтобы узнать, равны ли две строки, необходимо использовать оператор " = = " .Обычно, когда оператор "==" применяется к ссылочным объектам, он определяет, относятся ли обе ссылки к одному и тому же объекту. Но применительно к объектамтипа s t r i n g дело обстоит иначе. В этом случае проверяется равенство содержимогодвух строк.
То же справедливо и в отношении оператора " !=". Что касается остальныхоператоров отношения (например, " > " или ">="), то они сравнивают ссылки так же,как и объекты других типов.Рассмотрим программу, которая демонстрирует выполнение ряда операций над^троками.// Демонстрация выполнения некоторых операций над строками.using System;class Strops {public s t a t i c void Main() {string s t r l ="B .NET-программировании без С# не обойтись.";string str2 = string.Copy(strl);Глава 7. Массивы и строки773string str3 = "С#-строки —string strUpf strLow;int result, idx;могучая сила.";Console.WriteLine("strl: " + strl);Console.WriteLine("Длина строки strl: " +strl.Length);// Создаем прописную и строчную версии строки strl.strLow - strl.ToLower();strUp = strl.ToUpper();Console.WriteLine("Строчная версия строки strl:\nstrLow);Console.WriteLine("Прописная версия строки strl:\nstrUp);" +" +Console.WriteLine();// Отображаем strl в символьном режиме.Console.WriteLine("Отображаем strl посимвольно.");for(int i=0; i < strl.Length; i++)Console.Write(strl[i]);Console.WriteLine("\n");// Сравниваем строки,if (strl ===== str2)Console.WriteLine("strl == str2");elseConsole.WriteLine("strl != str2");if(strl « str3)Console.WriteLine("strl == str3") ;elseConsole.WriteLine("strl != str3");result = strl.CompareTo(str3);if(result == 0)Console.WriteLine("strl и str3 равны.");else if(result < 0)Console.WriteLine("strl меньше, чем str3");elseConsole.WriteLine("strl больше, чем str3");Console.WriteLine();// Присваиваем str2 новую строку.str2 = "Один Два Три Один";// Поиск строк.idx = str2.IndexOf("Один");Console.WriteLine("Индекс первого вхождения подстроки Один: " + idx);idx = str2.LastIndexOf("Один");Console.WriteLine("Индекс последнего вхождения подстроки Один: " + idx);174Часть I.
Язык С#При выполнении этой программы получаем следующие результаты:strl: В .NET-программировании без С# не обойтись.Длина строки strl: 43Строчная версия строки strl:в .net-программировании без с# не обойтись.Прописная версия строки strl:В .NET-ПРОГРАММИРОВАНИИ БЕЗ С# НЕ ОБОЙТИСЬ.Отображаем strl посимвольно.В .NET-программировании без С# не обойтись.strl == str2strl != str3strl больше, чем str3Индекс первого вхождения подстроки Один: ОИндекс последнего вхождения подстроки Один: 13С помощьюНапример, приstring strlstring str2string str3string str4оператора " + " можно конкатенировать (объединить) несколько строк.выполнении этого фрагмента кода= "Один";= "Два";^= "Три";= strl + str2 + str3;переменная s t r 4 инициализируется строкой "ОдинДваТри".И еще. Ключевое слово s t r i n g представляет собой псевдоним для классаSystem, s t r i n g , определенного библиотекой классов среды .NET Framework.
Такимобразом, поля и методы, определяемые типом s t r i n g , по сути являются полями иметодами класса System. S t r i n g (здесь были представлены только некоторые из них).Подробно класс System. S t r i n g рассматривается в части II.Массивы строкПодобно другим типам данных, строки могут быть собраны в массивы. Рассмотрим пример.// Демонстрацияиспользования массивовстрок.u s i n g System;class StringArrays {public s t a t i c void Main() {string[] s t r = { "Это", "очень", "простой", "тест."Console.WriteLine("Исходный массив: " ) ;for(int i=0; i < str.Length; i++)Console.Write(str[i] + " " ) ; "Console.WriteLine("\n");};t// Изменяем строку.str[l] = "тоже";str[3) = "тест, не правда ли?";Console.WriteLine("Модифицированный массив: " ) ;for(int i=0; i < str.Length;Console.Write(str[i] + " " ) ;Глава 7.
Массивы и строки175После выполнения этой программы получаем такие результаты:Исходный массив:Это очень простой тест.Модифицированный массив:Это тоже простой тест, не правда ли?А вот пример поинтереснее. Следующая программа отображает целочисленноезначение с помощью слов. Например, значение 19 будет отображено как словосочетание "один девять".// Отображение цифр целого числа с помощью слов.using System;class ConvertDigitsToWords {public static void Main() {int num;int nextdigit;int numdigits;int[] n = new int[20];string[] digits = { "нуль", "один", "два","три", "четыре", "пять","шесть", "семь", "восемь","девять" };num = 1908;Console.WriteLine("Число: " + num);Console.Write("Число в словах: " ) ;nextdigit = 0 ;numdigits - 0;/* Получаем отдельные цифры и сохраняем их в массиве п.Эти цифры хранятся в обратном порядке. */do {nextdigit - num % 10;n[numdigits] = nextdigit;numdigits++;num = num / 10;} while(num > 0 ) ;numdigits—;// Отображаем слова.for( ; numdigits >= 0; numdigits—)Console.Write(digits[n[numdigits]] + " " ) ;Console.WriteLine() ;Вот результаты выполнения этой программы:Число: 1908Число в словах: один девять нуль восемь176Часть I.
Язык С#В этой программе string-массив d i g i t s хранит в порядке возрастания словесныеэквиваленты цифр от нуля до девяти. Чтобы заданное целочисленное значение преобразовать в слова, сначала выделяется каждая цифра этого значения, начиная с крайней правой, и полученные цифры запоминаются в обратном порядке в int-массиве сименем п. Затем этот массив опрашивается от конца к началу, и каждое целое значение массива п используется в качестве индекса для доступа к элементам массиваd i g i t s , чтобы отобразить на экране соответствующую строку.Постоянство строкСледующее утверждение, вероятно, вас удивит: содержимое string-объектов неизменно. Другими словами, последовательность символов, составляющих строку, изменить нельзя. Хотя это кажется серьезным недостатком, на самом деле это не так.Это ограничение позволяет С# эффективно использовать строки. Если вам понадобится строка, которая должна представлять собой "вариацию на тему" уже существующей строки, создайте новую строку, которая содержит желаемые изменения.
Поскольку неиспользуемые строковые объекты автоматически утилизируются системойсбора мусора, даже не нужно беспокоиться о "брошенных" строках.При этом необходимо понимать, что ссылочные переменные типа s t r i n g могутменять объекты, на которые они ссылаются. А содержимое созданного s t r i n g объекта изменить уже невозможно.Чтобы до конца понять, почему неизменяемые строки не являются препятствиемдля программиста, воспользуемся еще одним методом класса s t r i n g : Substring ().Этот метод возвращает новую строку, которая содержит заданную часть вызывающейстроки.