Public String(char с, int count)



 

где с обозначает повторяющийся символ; a count — количество его повторений.

Кроме того, строку можно создать по заданному указателю на символьный массив, используя один из следующих конструкторов.

 

public String(char* value)

public String(char* value, int startlndex, int length)

 

Первая форма конструктора позволяет создать строку из символов, доступных из массива по указателю value . При этом предполагается, что массив, доступный по указателю value , завершается пустым символом, обозначающим конец строки. А во второй форме конструктора для этой цели из массива, доступного по указателю value , извлекается определенное количество символов (length), начиная с элемента, указываемого по индексу startlndex. В этих конструкторах применяются указатели, поэтому их можно использовать только в небезопасном коде.

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

 

public String(sbyte* value)

public String(sbyte* value, int startlndex, int length)

public String(sbyte* value, int startlndex, int length, Encoding enc)

 

Первая форма конструктора позволяет построить строку из отдельных байтов символов, доступных из массива по указателю value. При этом предполагается, что массив, доступный по указателю value, завершается признаком конца строки. Во второй форме конструктора для этой цели из массива, доступного по указателю value, извлекается определенное количество байтов символов (length), начиная с элемента, указываемого по индексу startlndex. А третья форма конструктора позволяет указать количество кодируемых байтов. Класс Encoding находится в пространстве имен System. Text. В этих конструкторах применяются указатели, и поэтому их можно использовать только в небезопасном коде.

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

 

string str = "новая строка";

 

 

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

 

В классе String определено единственное поле.

 

public static readonly string Empty

 

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

Помимо этого, в классе String определен единственный индексатор, доступный только для чтения.

 

public char this[int index] { get; }

 

Этот индексатор позволяет получить символ по указанному индексу. Индексация строк, как и массивов, начинается с нуля. Объекты типа String отличаются постоянством и не изменяются, поэтому вполне логично, что в классе String поддерживается индексатор, доступный только для чтения.

И наконец, в классе String определено единственное свойство, доступное только для чтения.

 

public int Length { get; }

 

Свойство Length возвращает количество символов в строке.

 

 

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

 

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

Как станет ясно дальше, во многих видах сравнения символьных строк используются сведения о культурной среде. Но это не относится к операторам == и !=. Ведь они просто сравнивают порядковые значения символов в строках. (Иными словами, они сравнивают двоичные значения символов, не видоизмененные нормами культурной среды, т.е. региональными стандартами.) Следовательно, эти операторы выполняют сравнение строк без учета регистра и настроек культурной среды.

 

 

Сравнение строк

 

Вероятно, из всех операций обработки символьных строк чаще всего выполняется сравнение одной строки с другой. Прежде чем рассматривать какие-либо методы сравнения строк, следует подчеркнуть следующее: сравнение строк может быть выполнено в среде .NET Framework двумя основными способами. Во-первых, сравнение может отражать обычаи и нормы отдельной культурной среды, которые зачастую представляют собой настройки культурной среды, вступающие в силу при выполнении программы. Это стандартное поведение некоторых, хотя и не всех методов сравнения. И во-вторых, сравнение может быть выполнено независимо от настроек культурной среды только по порядковым значениям символов, составляющих строку. Вообще говоря, при сравнении строк без учета культурной среды используется лексикографический порядок (и лингвистические особенности), чтобы определить, является ли одна строка больше, меньше или равной другой строке. При порядковом сравнении строки просто упорядочиваются на основании невидоизмененного значения каждого символа.

-----------------------------

ПРИМЕЧАНИЕ

В силу отличий способов сравнения строк с учетом культурной среды и порядкового сравнения, а также последствий каждого такого сравнения настоятельно рекомендуется руководствоваться лучшими методиками, предлагаемыми в настоящее время корпорацией Microsoft. Ведь выбор неверного способа сравнения строк может привести к неправильной работе программы, когда она эксплуатируется в среде, отличающей от той, в которой она разработана.

-----------------------------

Выбор способа сравнения символьных строк представляет собой весьма ответственное решение. Как правило и без всякий исключений, следует выбирать сравнение строк с учетом культурной среды, если это делается для целей отображения результата пользователю (например, для вывода на экран ряда строк, отсортированных в лексикографическом порядке). Но если строки содержат фиксированную информацию, не предназначенную для видоизменения с учетом отличий в культурных средах, например, имя файла, ключевое слово, адрес веб-сайта или значение, связанное с обеспечением безопасности, то следует выбрать порядковое сравнение строк. Разумеется, особенности конкретного разрабатываемого приложения будут диктовать выбор подходящего способа сравнения символьных строк.

В классе String предоставляются самые разные методы сравнения строк, перечисленные в табл.22.1. Наиболее универсальным среди них является метод Compare(). Он позволяет сравнивать две строки полностью или частично, с учетом или без учета регистра, способа сравнения, определяемого параметром типа StringComparison, а также сведений о культурной среде, предоставляемых с помощью параметра типа Culturelnfo. Те перегружаемые варианты метода Compare(), которые не содержат параметр типа StringComparison, выполняют сравнение символьных строк с учетом регистра и культурной среды. А в тех перегружаемых его вариантах, которые не содержат параметр типа Culturelnfo, сведения о культурной среде определяются текущей средой выполнения. В примерах программ, приведенных в этой главе, параметр типа Culturelnfo не используется, а большее внимание уделяется использованию параметра типа StringComparison.

 

Таблица 22.1. Методы сравнения символьных строк

 

Метод -  Назначение

 

public static int Compare(string strA,  string strB) -  Сравнивает строку strA со строкой strB. Возвращает положительное значение, если строка strA больше строки strB ;  отрицательное значение, если строка strA меньше строки strB ; и нуль, если строки strA и 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, string strB,  StringComparison  comparisonType) -  Сравнивает строку strA со строкой strB. Возвращает положительное значение, если строка strA больше строки strB ; отрицательное значение, если строка strA меньше строки strB, и нуль, если строки strA и strB равны. Параметр comparisonType  определяет конкретный способ сравнения строк

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

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 Compare(string strA,  int indexA, string  strB, int indexB,  int length, bool  ignoreCase) -  Сравнивает части строк strA и strB. Сравнение начинается со строковых элементов str А[ indexA] и strB[indexB]  и включает количество символов, определяемых параметром length. Метод возвращает положительное значение, если часть строки strA больше части строки strB ; отрицатель ное значение, если часть строки strA меньше части строки strB ; и нуль, если сравниваемые части строк strA и strB равны. Если параметр ignoreCase принимает логическое значение true, то при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Сравнение выполняется с учетом культурной среды

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

public static int Compare(string  strA, int indexA,  string strB, int  indexB, int length,  bool ignoreCase,  Culturelnfo culture) -  Сравнивает части строк strA и strB , используя информацию о культурной среде, определяемую параметром culture. Сравнение начинается со строковых элементов strA[indexA] и strB[indexB] и включает количество символов, определяемых параметром length. Метод возвращает положительное значение, если часть строки strA  больше части строки strB ; отрицательное значение, если часть строки strA меньше части строки strB ; и нуль, если сравниваемые части строк strA и strB равны. Если параметр ignoreCase принимает логическое значение true, то при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Класс Culturelnfo определен в пространстве имен System.Globalization

public static int Compare(string  strAf string strB,  Culturelnfo culture,  CompareOptions  options) -  Сравнивает строку strA со строкой strB ,   используя информацию о культурной среде, обозначаемую параметром culture, а также варианты сравнения, передаваемые в качестве параметра options. Возвращает положительное значение, если строка strA больше строки strB ; отрицательное значение, если строка strA меньше строки strB ; и нуль, если строки strA и strB равны. Классы Culturelnfo и CompareOptions определены в пространстве имен System.Globalization

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

public static int CompareOrdinal(string  strA, string strB) -  Сравнивает строку strAco строкой strB независимо от культурной среды, языка и региональных стандартов. Возвращает положительное значение, если строка strA больше строки strB; отрицательное значение, если строка strA меньше строки strB ;   и нуль, если строки strA и strB равны

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

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

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

public override bool Equals(object  obj) -  Возвращает логическое значение true, если вызывающая строка содержит ту же последовательность символов, что и строковое представление объекта obj. Выполняется порядковое сравнение с учетом регистра, но без учета культурной среды

public bool Equals(string  value) -  Возвращает логическое значение true, если вызывающая строка содержит ту же последовательность символов, что и строка value. Выполняется порядковое сравнение с учетом регистра, но без учета культурной среды

public bool Equals(string  value,  StringComparison  comparisonType) -  Возвращает логическое значение true, если вызывающая

строка содержит ту же последовательность символов, что и строка value. Параметр comparison Туре определяет конкретный способ сравнения строк

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

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

сравнения строк

 

Тип StringComparison представляет собой перечисление, в котором определяются значения, приведенные в табл.22.2. Используя эти значения, можно организовать сравнение строк, удовлетворяющее потребностям конкретного приложения. Следовательно, добавление параметра типа StringComparison расширяет возможности метода Compare() и других методов сравнения, например, Equals(). Это дает также возможность однозначно указывать способ предполагаемого сравнения строк. В силу имеющих отличий между сравнением строк с учетом культурной среды и порядковым сравнением очень важно быть предельно точным в этом отношении. Именно по этой причине в примерах программ, приведенных в данной книге, параметр типа StringComparison явно указывается в вызовах тех методов, в которых он поддерживается.

 

Таблица 22.2. Значения, определяемые в перечислении StringComparison

 

Значение -  Описание

 

CurrentCulture -  Сравнение строк производится с использованием текущих настроек параметров культурной среды

CurrentCultureIgnoreCase -  Сравнение строк производится с использованием текущих настроек параметров культурной среды, но без учета регистра

InvariantCulture -  Сравнение строк производится с использованием неизменяемых, т.е. универсальных данных о культурной среде

InvariantCulturelngoreCase -  Сравнение строк производится с использованием не изменяемых, т.е. универсальных данных о культурной среде и без учета регистра

Ordinal -  Сравнение строк производится с использованием порядковых значений символов в строке. При этом лексикографический порядок может нарушиться, а условные обозначения, принятые в отдельной культурной среде, игнорируются

OrdinalIgnoreCase -  Сравнение строк производится с использованием порядковых значений символов в строке, но без учета регистра. При этом лексикографический порядок может нарушиться, а условные обозначения, принятые в отдельной культурной среде, игнорируются

 

В любом случае метод Compare() возвращает отрицательное значение, если первая сравниваемая строка оказывается меньше второй; положительное значение, если первая сравниваемая строка больше второй; и наконец, нуль, если обе сравниваемые строки равны. Несмотря на то что метод Compare() возвращает нуль, если сравниваемые строки равны, для определения равенства символьных строк, как правило, лучше пользоваться методом Equals() или же оператором ==. Дело в том, что метод Compare() определяет равенство сравниваемых строк на основании порядка их сортировки. Так, если выполняется сравнение строк с учетом культурной среды, то обе строки могут оказаться одинаковыми по порядку их сортировки, но не равными по существу. По умолчанию равенство строк определяется в методе Equals(), исходя из порядковых значений символов и без учета культурной среды. Следовательно, по умолчанию обе строки сравниваются в этом методе на абсолютное, посимвольное равенство подобно тому, как это делается в операторе ==.

Несмотря на большую универсальность метода Compare(), для простого порядкового сравнения символьных строк проще пользоваться методом CompareOrdinal(). И наконец, следует иметь в виду, что метод CompareTo() выполняет сравнение строк только с учетом культурной среды. На момент написания этой книги отсутствовали перегружаемые варианты этого метода, позволявшие указывать другой способ сравнения символьных строк.

В приведенной ниже программе демонстрируется применение методов Compare(), Equals(), CompareOrdinal(), а также операторов == и != для сравнения символьных строк. Обратите внимание на то, что два первых примера сравнения наглядно демонстрируют отличия между сравнением строк с учетом культурной среды и порядковым сравнением в англоязычной среде.

 

// Продемонстрировать разные способы сравнения символьных строк.

using System;

class CompareDemo {

static void Main() {

string str1 = "alpha";

string str2 = "Alpha";

string str3 = "Beta";

string str4 = "alpha";

string str5 = "alpha, beta";

int result;

 


Дата добавления: 2019-02-12; просмотров: 325; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!