Строки

Работу с объектами поясним также на примере строк, которые традиционно можно воспринимать и как тип данных string, и как объекты класса String библиотеки System.

Тип данных string – псевдоним класса String, поэтому слово можно начинать как со строчной, так и прописной буквы.

С точки зрения программирования этот тип данных относится к числу самых важных в C#. Этот тип определяет и поддерживает символьные строки в кодировке Unicode (1 символ – 2 байта).

В целом ряде других языков программирования строка представляет собой массив символов. А в C# строки относятся к числу ссылочных типов, т.е. фактически являются объектами класса String, которые, однако, имеют свои особенности.

Для любителей коротких примеров со строками: Исполнитель. Редактор или задача Число слов в тексте.

 Объявление и инициализация строк

Также как массивы, строки необходимо объявлять и инициализировать.
Объявление строк формально не отличается от объявления встроенных типов данных (например, int) или любых объектов:
string s1;
При объявлении только создается ссылка на строку, однако фактически строка не создается. Попытка обратиться к строке по ссылке приводит к стандартной ошибке:
Использование локальной переменной «s1», которой не присвоено значение.

Инициализация пустой строки может быть выполнена оператором:
s1 = string.Empty;

Чаще всего совмещают объявление и инициализацию строки:
string s1 = string.Empty;
В результате мы получим строку из 0 символов. Такая строка может использоваться для сравнения с другими строками или же, как начальная строка, к которой будут добавляться другие наборы символов.

Простой способ построить символьную строку — воспользоваться строковым литералом. Например, в следующей строке кода переменной ссылки на строку s2 присваивается ссылка на строковый литерал (последовательность символов, заключенных в двойные кавычки):
string s2 = «Пример строки»;
В данном случае переменная s2 инициализируется последовательностью символов «Пример строки».

Объект типа string можно также создать из массива типа char. Например:
char[] chararray = {‘e’, ‘x’, ‘a’, ‘m’, ‘p’, ‘l’, ‘e’};
string s3 = new string(chararray);

Как только объект типа string будет создан, его можно использовать везде, где только требуется строка текста, заключенного в кавычки.

В последнем варианте строка s3 объявляется и инициализируется явно как объект, где string( ) – конструктор класса с параметрами (имеет 8 перегрузок метода с разным количеством и типом параметров). Например, если необходимо создать строку из 60 одинаковых символов, например, подчеркиваний, то для этого достаточно выполнить следующий оператор:
string s4 = new String(‘_’, 60);

Изучите с помощью интеллектуальной подсказки все 8 перегрузок конструктора string(…).

Я предполагаю, что некоторое особое место строк как типов данных в языке C# связано с тем, что содержимое объекта типа string не подлежит изменению. Это означает, что однажды созданную последовательность символов изменить нельзя (напомним, что содержимое строк, как и любых объектов, располагается в управляемой куче).

Но данное ограничение способствует более эффективной реализации символьных строк. Поэтому этот, на первый взгляд, очевидный недостаток на самом деле превращается в преимущество. Так, если требуется строка в качестве разновидности уже имеющейся строки, то для этой цели следует создать новую строку, содержащую все необходимые изменения.

А поскольку неиспользуемые строковые объекты автоматически собираются в «мусор», то о дальнейшей судьбе ненужных строк можно даже не беспокоиться.

Следует, однако, подчеркнуть, что переменные ссылки на строки (т.е. объекты типа string) подлежат изменению, а следовательно, они могут ссылаться на другой объект. Но содержимое самого объекта типа string не меняется после его создания.

Работа со строками. В классе System.String предоставляется набор методов для определения длины символьных данных, поиска подстроки в текущей строке, преобразования символов из верхнего регистра в нижний и наоборот, и т.д. Далее мы рассмотрим этот класс более подробно.

Поле, индексатор и свойство класса String

В классе String определено единственное поле:
public static readonly string Empty;
Поле Empty обозначает пустую строку, т.е. такую строку, которая не содержит символы. Этим оно отличается от пустой ссылки типа String, которая просто делается на несуществующий объект.

Помимо этого, в классе String определен единственный индексатор, доступный только для чтения:
public char this[int index] { get; }
Этот индексатор позволяет получить символ по указанному индексу.

Индексация символов в строке, как и элементов массива, начинается с нуля. Объекты типа String отличаются постоянством и не изменяются, поэтому вполне логично, что в классе String поддерживается индексатор, доступный только для чтения. Для извлечения пятого символа из строки s1 достаточно написать:
char ch = s1[4];

В классе String определено единственное свойство, доступное только для чтения:
public int Length { get; }
Свойство Length возвращает количество символов в строке.

В примере показано использование индексатора и свойства Length:

// Строка - палиндром
// пример: "чем нежен меч"
using System;
namespace палиндром
{
   class Program
   {
      static void Main(string[] args)
      {
         Console.Write("Cлово: ");
         string s = Console.ReadLine();
         if (ItIsPalindrom(s))
            Console.Write("это - палиндром ");
         else
            Console.Write("не палиндром ");
         Console.ReadKey();
      }
      // Проверка. Возврат ДА/НЕТ
      static bool ItIsPalindrom(string s)
      {
         bool b = true;
         for (int k = 0; k < s.Length / 2; k++)
         {
            if (s[k] != s[s.Length - 1 - k])
               b = false;
         }
         return b;
      }
   }
}

Операторы класса String

В классе String перегружаются два следующих оператора:  == и !=.

Оператор  ==  служит для проверки двух символьных строк на равенство. Когда оператор == применяется к ссылкам на объекты, он обычно проверяет, делаются ли обе ссылки на один и тот же объект. А когда оператор == применяется к ссылкам на объекты типа String, то на предмет равенства сравнивается содержимое самих строк.

Это же относится и к оператору !=. Когда он применяется к ссылкам на объекты типа String, то на предмет неравенства сравнивается содержимое самих строк.

В то же время другие операторы отношения, в том числе < и >=, сравнивают ссылки на объекты типа String таким же образом, как и на объекты других типов. А для того чтобы проверить, является ли одна строка больше другой, следует вызвать метод Compare(), определенный в классе String (см.ниже).

Примечание. Как станет ясно дальше, во многих видах сравнения символьных строк используются сведения о культурной среде. Но это не относится к операторам == и !=. Они просто сравнивают порядковые значения символов в строках. (Иными словами, они сравнивают двоичные значения символов, не видоизмененные нормами культурной среды, т.е. региональными стандартами.) Пример регионального стандарта: точка-запятая в записи действительных (не целых) чисел — В России в школе пишем число Пи = 3,14  — на Западе 3.14 ;   у них 345,123 соответствует нашим 345 123 (у них разделитель «,» — у нас пробел, или без него). В MS Excel это можно настраивать. Еще пример: Буква Ё по алфавиту после Е, но не по коду символа. Культурная среда — привычки восприятия, более точный термин — региональные (страна как регион) стандарты. Следовательно, эти операторы выполняют сравнение строк без учета регистра и настроек культурной среды.

Методы класса String

Ниже перечислены некоторые наиболее интересные методы этого класса, сгруппированные по назначению:

1) Сравнение строк:
public static int Compare(string strA, string strB);
public static int Compare(string strA, string strB, bool ignoreCase);
Статический метод, сравнивает строку strA со строкой strB. Возвращает положительное значение, если строка strA больше строки strB; отрицательное значение, если строка strA меньше строки strB; и нуль, если строки strA и strB равны. Если параметр ignoreCase принимает логическое значение true, то при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются.

public static int Compare(string strA, int indexA, string strB, int indexB, int length);
Сравнивает части строк strA и strB. Сравнение начинается со строковых элементов strA[indexA] и strB[indexB] и включает количество символов, определяемых параметром length. Метод возвращает положительное значение, если часть строки strA больше части строки strB; отрицательное значение, если часть строки strA меньше части строки strB; и нуль, если сравниваемые части строк strA и strB равны.

public static int CompareOrdinal(string strA, int indexA, string strB, int indexB, int count);
Делает то же, что и метод Compare(), но без учета локальных установок.

public int CompareTo(object value)
Сравнивает вызывающую строку со строковым представлением объекта value. Возвращает положительное значение, если вызывающая строка больше строки value; отрицательное значение, если вызывающая строка меньше строки value; и нуль, если сравниваемые строки равны.

public static bool Equals(string a, string b, StringComparison comparisonType);
Возвращает логическое значение true, если строка a содержит ту же последовательность символов, что и строка b. Выполняется порядковое сравнение с учетом регистра, но без учета культурной среды. Параметр comparisonType определяет конкретный способ сравнения строк.

2) Конкатенация (соединение) строк  Concat()
public static string Concat(string str0, string str1);
public static string Concat(params string[] values);
Комбинирует отдельные экземпляры строк в одну строку (конкатенация).

3) Поиск в строке
public bool Contains(string value)
Метод, который позволяет определить, содержится ли в строке определенная подстрока (value)

public bool StartsWith(string value)
Возвращает логическое значение true, если вызывающая строка начинается с подстроки value. В противном случае возвращается логическое значение false. public bool EndsWith(string value, StringComparison comparisonType)

Возвращает логическое значение true, если вызывающая строка оканчивается подстрокой value. В противном случае возвращает логическое значение false. Параметр comparisonType определяет конкретный способ поиска.

public int IndexOf(char value)
public int IndexOf(string value)
Находит первое вхождение заданной подстроки или символа в строке. Если искомый символ или подстрока не обнаружены, то возвращается значение -1.

public int IndexOf(char value, int startIndex)
public int IndexOf(string value, int startIndex)
public int IndexOf(char value, int startIndex, int count)
public int IndexOf(string value, int startIndex, int count)
Возвращает индекс первого вхождения символа или подстроки value в вызывающей строке. Поиск начинается с элемента, указываемого по индексу startIndex, и охватывает число элементов, определяемых параметром count (если указан). Метод возвращает значение -1, если искомый символ или подстрока не обнаружен.
LastIndexOf() . Перегруженные версии аналогичны методу IndexOf() То же, что IndexOf, но находит последнее вхождение символа или подстроки, а не первое.

public int IndexOfAny(char[] anyOf)
public int IndexOfAny(char[] anyOf, int startIndex)
public int IndexOfAny(char[] anyOf, int startIndex, int count)
Возвращает индекс первого вхождения любого символа из массива anyOf, обнаруженного в вызывающей строке. Поиск начинается с элемента, указываемого по индексу startIndex, и охватывает число элементов, определяемых параметром count (если они указаны). Метод возвращает значение -1, если не обнаружено совпадение ни с одним из символов из массива anyOf. Поиск осуществляется порядковым способом.

LastIndexOfAny. Перегруженные версии аналогичны методу IndexOfAny() Возвращает индекс последнего вхождения любого символа из массива anyOf, обнаруженного в вызывающей строке.

4) Разделение и соединение строк
public string[] Split(params char[] separator)
public string[] Split(params char[] separator, int count)
Метод, возвращающий массив string с присутствующими в данном экземпляре подстроками внутри, которые отделяются друг от друга элементами из указанного массива char или string.
В первой форме метода Split() вызывающая строка разделяется на составные части. В итоге возвращается массив, содержащий подстроки, полученные из вызывающей строки. Символы, ограничивающие эти подстроки, передаются в массиве separator. Если массив separator пуст или ссылается на пустую строку, то в качестве разделителя подстрок используется пробел. А во второй форме данного метода возвращается количество подстрок, определяемых параметром count.

public string[] Split(params char[] separator, StringSplitOptions options)
public string[] Split(string[] separator, StringSplitOptions options)
public string[] Split(params char[] separator, int count, StringSplitOptions options)
public string[] Split(string[] separator, int count, StringSplitOptions options)
В двух первых формах метода Split() вызывающая строка разделяется на части и возвращается массив, содержащий подстроки, полученные из вызывающей строки. Символы, разделяющие эти подстроки, передаются в массиве separator. Если массив separator пуст, то в качестве разделителя используется пробел. А в третьей и четвертой формах данного метода возвращается количество строк, ограничиваемое параметром count.
Но во всех формах параметр options обозначает конкретный способ обработки пустых строк, которые образуются в том случае, если два разделителя оказываются рядом. В перечислении StringSplitOptions определяются только два значения: None и RemoveEmptyEntries. Если параметр options принимает значение None, то пустые строки включаются в конечный результат разделения исходной строки. А если параметр options принимает значение RemoveEmptyEntries, то пустые строки исключаются из конечного результата разделения исходной строки.

public static string Join(string separator, string[] value, int startIndex, int count)
Строит новую строку, комбинируя содержимое массива строк. В первой форме метода Join() возвращается строка, состоящая из сцепляемых подстрок, передаваемых в массиве value. Во второй форме также возвращается строка, состоящая из подстрок, передаваемых в массиве value, но они сцепляются в определенном количестве count, начиная с элемента массива value[startIndex]. В обеих формах каждая последующая строка отделяется от предыдущей разделительной строкой, определяемой параметром separator.

5) Заполнение и обрезка строк
Trim() public string Trim()
public string Trim(params char[] trimChars)
Метод, который позволяет удалять все вхождения определенного набора символов с начала и конца текущей строки.
В первой форме метода Trim() из вызывающей строки удаляются начальные и конечные пробелы. А во второй форме этого метода удаляются начальные и конечные вхождения в вызывающей строке символов из массива trimChars. В обеих формах возвращается получающаяся в итоге строка.

public string PadLeft(int totalWidth)
public string PadLeft(int totalWidth, char paddingChar)
Позволяет дополнить строку символами слева. В первой форме метода PadLeft() вводятся пробелы с левой стороны вызывающей строки, чтобы ее общая длина стала равной значению параметра totalWidth. А во второй форме данного метода символы, обозначаемые параметром paddingChar, вводятся с левой стороны вызывающей строки, чтобы ее общая длина стала равной значению параметра totalWidth. В обеих формах возвращается получающаяся в итоге строка. Если значение параметра totalWidth меньше длины вызывающей строки, то возвращается копия неизмененной вызывающей строки.

PadRight() Аналогично PadLeft() Позволяет дополнить строку символами справа.

6) Вставка, удаление и замена строк
public string Insert(int startIndex, string value)
Используется для вставки одной строки в другую, где value обозначает строку, вставляемую в вызывающую строку по индексу startIndex. Метод возвращает получившуюся в итоге строку.

public string Remove(int startIndex, int count)
Используется для удаления части строки. В первой форме метода Remove() удаление выполняется, начиная с места, указываемого по индексу startIndex, и продолжается до конца строки. А во второй форме данного метода из строки удаляется количество символов, определяемое параметром count, начиная с места, указываемого по индексу startIndex.

public string Replace(string oldValue, string newValue)
Используется для замены части строки. В первой форме метода Replace() все вхождения символа oldChar в вызывающей строке заменяются символом newChar. А во второй форме данного метода все вхождения строки oldValue в вызывающей строке заменяются строкой newValue.

Смена регистра. ToUpper() public string ToUpper() Делает заглавными все буквы в вызывающей строке.  ToLower() public string ToLower() Делает строчными все буквы в вызывающей строке.

7) Получение подстроки из строки
public string Substring(int startIndex)
public string Substring(int startIndex, int length)
В первой форме метода Substring() подстрока извлекается, начиная с места, обозначаемого параметром startIndex, и до конца вызывающей строки. А во второй форме данного метода извлекается подстрока, состоящая из количества символов, определяемых параметром length, начиная с места, обозначаемого параметром startIndex.

Пример следующей программы использует несколько из вышеуказанных методов:

using System;
namespace Строки
{
   class Program
   {
      static void Main(string[] args)
      {
      // Сравним первые две строки
         string s1 = "это строка";
         string s2 = "это текст, а это строка";
         if (String.CompareOrdinal(s1, s2) != 0)
            Console.WriteLine("Строки s1 и s2 не равны");
         if (String.Compare(s1, 0, s2, 13, 10, true) == 0)
            Console.WriteLine("При этом в них есть одинаковый текст");
      // Конкатенация строк
         Console.WriteLine(String.Concat("\n" + "Один, два, ", "три, четыре"));
      // Поиск в строке
       // Первое вхождение подстроки
         if (s2.IndexOf("это") != -1)
            Console.WriteLine("Слово \"это\" найдено в строке, оно " +
 "находится на: {0} позиции", s2.IndexOf("это"));
       // Последнее вхождение подстроки
         if (s2.LastIndexOf("это") != -1)
            Console.WriteLine("Последнее вхождение слова \"это\" находится " + "на {0} позиции", s2.LastIndexOf("это"));
       // Поиск из массива символов
         char[] myCh = { 'Ы', 'х', 'т' };
         if (s2.IndexOfAny(myCh) != -1)
            Console.WriteLine("Один из символов из массива ch " +
 "найден в текущей строке на позиции {0}", s2.IndexOfAny(myCh));
       // Определяем начинается ли строка с заданной подстроки
        if (s2.StartsWith("это текст") == true)
           Console.WriteLine("Подстрока найдена!");
       // Определяем содержится ли в строке подстрока
       // на примере определения ОС пользователя
         string myOS = Environment.OSVersion.ToString();
         if (myOS.Contains("NT 5.1"))
            Console.WriteLine("Ваша операционная система Windows XP");
         else if (myOS.Contains("NT 6.1"))
            Console.WriteLine("Ваша операционная система Windows 7");
         Console.ReadLine();
      }
   }
}

Результат:

Демо применения методов класса String

Используйте при обработке текста все возможности, заложенные в класс String.

В C# широко используется такой тип данных (определяемый пользователем) как перечисление.

И наконец, следует рассмотреть важнейшее ключевое понятие как методы класса.


NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.


Помощь проекту:

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
2 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Я правильно понимаю, что при сравнении строк с помощью == и Equals результат будет одинаковым? Или какая-то разница есть?
Спасибо за книгу!

В разделе «Объявление и инициализация строк»:

«В последнем варианте строка s3 объявляется и инициализируется явно как объект, где string( ) – конструктор класса…»
Наверное: …new string( ) – конструктор класса…

2
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x