Empty c что это
Перейти к содержимому

Empty c что это

  • автор:

 

Определить, пуста ли строка в C++

В этом посте мы обсудим, как определить, пуста ли строка в C++.

1. Использование string::empty

Стандартный способ определить, пуста строка или нет, — использовать string::empty функция. Он возвращается true если его длина равна 0, false в противном случае. Например,

результат:

String is empty

2. Использование string::size

The string::size Функция возвращает количество байтов в строке. Пустая строка будет иметь размер 0. Ее можно использовать следующим образом:

результат:

String is empty

3. Использование string::length

The string::length Функция возвращает длину строки в байтах. Это псевдоним string::size функция.

результат:

String is empty

Это все, что касается определения того, пуста ли строка в C++.

Оценить этот пост

Средний рейтинг 5 /5. Подсчет голосов: 1

Голосов пока нет! Будьте первым, кто оценит этот пост.

Сожалеем, что этот пост не оказался для вас полезным!

Расскажите, как мы можем улучшить этот пост?

Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования ��

Строки

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

Построение строк

Самый простой способ построить символьную строку — воспользоваться строковым литералом. Например, в следующей строке кода переменной ссылки на строку str присваивается ссылка на строковый литерал:

В данном случае переменная str инициализируется последовательностью символов «Пример строки». Объект типа string можно также создать из массива типа char. Например:

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

Постоянство строк

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

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

Скомпилируем приложение и загрузим результирующую сборку в утилиту ildasm.exe. На рисунке показан CIL-код, который будет сгенерирован для метода void addNewString():

CIL-код

Обратите внимание на наличие многочисленных вызовов кода операции ldstr (загрузка строки). Этот код операции ldstr в CIL предусматривает выполнение загрузки нового объекта string в управляемую кучу. В результате предыдущий объект, в котором содержалось значение «This is my stroke», будет в конечном итоге удален сборщиком мусора.

Работа со строками

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

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

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

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

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

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

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

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

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

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

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

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

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

public static int Compare(string strA, string strB, bool ignoreCase)

public static int Compare(string strA, string strB, StringComparison comparisonType)

public static int Compare(string strA, string strB, bool ignoreCase, CultureInfo culture)

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

Если параметр ignoreCase принимает логическое значение true, то при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются.

Параметр comparisonType определяет конкретный способ сравнения строк. Класс CultureInfo определен в пространстве имен System.Globalization.

public static int Compare(string strA, int indexA, string strB, int indexB, int length, bool ignoreCase)

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 равны. Сравнение выполняется с учетом регистра и культурной среды.

Делает то же, что и метод Compare(), но без учета локальных установок

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

Сравнивает вызывающую строку со строкой strB

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

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

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

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

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

Находит первое вхождение заданной подстроки или символа в строке. Если искомый символ или подстрока не обнаружены, то возвращается значение -1

public int IndexOf(string value, int startIndex)

public int IndexOf(char value, int startIndex, int count)

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

То же, что IndexOf, но находит последнее вхождение символа или подстроки, а не первое

public int IndexOfAny(char[] anyOf, int startIndex)

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

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

Метод, возвращающий массив string с присутствующими в данном экземпляре подстроками внутри, которые отделяются друг от друга элементами из указанного массива char или string.

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

public string[] Split(string[] separator, StringSplitOptions options)

public string[] Split(params char[] separator, int count, StringSplitOptions options)

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

Но во всех формах параметр options обозначает конкретный способ обработки пустых строк, которые образуются в том случае, если два разделителя оказываются рядом. В перечислении StringSplitOptions определяются только два значения: None и RemoveEmptyEntries. Если параметр options принимает значение None, то пустые строки включаются в конечный результат разделения исходной строки. А если параметр options принимает значение RemoveEmptyEntries, то пустые строки исключаются из конечного результата разделения исходной строки.

Строит новую строку, комбинируя содержимое массива строк.

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

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

В первой форме метода Trim() из вызывающей строки удаляются начальные и конечные пробелы. А во второй форме этого метода удаляются начальные и конечные вхождения в вызывающей строке символов из массива trimChars. В обеих формах возвращается получающаяся в итоге строка.

Позволяет дополнить строку символами слева.

Позволяет дополнить строку символами справа.

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

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

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

Делает заглавными все буквы в вызывающей строке.

Делает строчными все буквы в вызывающей строке.

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

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

Полезные свойства строк

Немного о сравнении строк в C#

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

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

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

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

 

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

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

Те перегружаемые варианты метода Compare(), которые не содержат параметр типа StringComparison, выполняют сравнение символьных строк с учетом регистра и культурной среды. А в тех перегружаемых его вариантах, которые не содержат параметр типа CultureInfo, сведения о культурной среде определяются текущей средой выполнения.

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

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

Значения, определяемые в перечислении StringComparison

Значение Описание
CurrentCulture Сравнение строк производится с использованием текущих настроек параметров культурной среды
CurrentCultureIgnoreCase Сравнение строк производится с использованием текущих настроек параметров культурной среды, но без учета регистра
InvariantCulture Сравнение строк производится с использованием неизменяемых, т.е. универсальных данных о культурной среде
InvariantCultureIgnoreCase Сравнение строк производится с использованием неизменяемых, т.е. универсальных данных о культурной среде и без учета регистра
Ordinal Сравнение строк производится с использованием порядковых значений символов в строке. При этом лексикографический порядок может нарушиться, а условные обозначения, принятые в отдельной культурной среде, игнорируются
OrdinalIgnoreCase Сравнение строк производится с использованием порядковых значений символов в строке, но без учета регистра

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

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

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

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

What is the difference between String.Empty and "" (empty string)?

In .NET, what is the difference between String.Empty and «» , and are they interchangable, or is there some underlying reference or Localization issues around equality that String.Empty will ensure are not a problem?

18 Answers 18

In .NET prior to version 2.0, «» creates an object while string.Empty creates no object ref , which makes string.Empty more efficient.

In version 2.0 and later of .NET, all occurrences of «» refer to the same string literal, which means «» is equivalent to .Empty , but still not as fast as .Length == 0 .

.Length == 0 is the fastest option, but .Empty makes for slightly cleaner code.

Callum Watkins's user avatar

what is the difference between String.Empty and «», and are they interchangable

string.Empty is a read-only field whereas «» is a compile time constant. Places where they behave differently are:

Default Parameter value in C# 4.0 or higher

Case expression in switch statement

Attribute arguments

Habib's user avatar

The previous answers were correct for .NET 1.1 (look at the date of the post they linked: 2003). As of .NET 2.0 and later, there is essentially no difference. The JIT will end up referencing the same object on the heap anyhow.

Each string literal does not necessarily result in a new string instance. When two or more string literals that are equivalent according to the string equality operator (Section 7.9.7) appear in the same assembly, these string literals refer to the same string instance.

Someone even mentions this in the comments of Brad Abram’s post

In summary, the practical result of "" vs. String.Empty is nil. The JIT will figure it out in the end.

I have found, personally, that the JIT is way smarter than me and so I try not to get too clever with micro-compiler optimizations like that. The JIT will unfold for() loops, remove redundant code, inline methods, etc better and at more appropriate times than either I or the C# compiler could ever anticipate before hand. Let the JIT do its job 🙂

C#: строки (Strings)

Тип string (синоним System.String ) представляет беспрерывную последовательность юникод символов. Строковые литералы указываются внутри двойных кавычек.

String — ссылочный тип, однако операторы отношений взаимодействуют со строками как со значимыми типами:

Управляющие последовательности, применимые к типу char , могут использоваться и внутри строк:

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

Чтобы избежать этой проблемы можно использовать дословные (буквальные, verbatim) строковые литералы. Эти литералы начинаются с символа @ и не поддерживают управляющих последовательностей. Они могут занимать несколько строк. Чтобы использовать внутри дословных литералов двойные кавычки их нужно писать дважды.

Объединение (concatenation) строк

Оператор + объединяет две строки:

Один из операндов может быть и не строкой. В этом случает для него скрыто будет вызван метод ToString :

Многократное использование оператора + для построения большой составной строки может быть не эффективным. Для этой цели лучше использовать тип System.Text.StringBuilder , который представляет динамически изменяющуюся строку и включает методы Append , Insert , Remove , и Replace .

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

Строки не поддерживают операторы < и > . Вместо них для сравнения строк нужно использовать строковой метод CompareTo , который возвращает 1 если первая строка предшествует второй, -1 если вторая строка предшествует первой и 0 если строки равны:

Поиск в строке и перечисление

Строковой индексатор возвращает символ с указанной позицией:

string реализует интерфейс IEnumerable<char> , поэтому по символам строки можно проходить с помощью foreach :

Простейшими методами для выполнения поиска в строке являются Contains , StartsWith , и EndsWith , все они возвращают true или false :

Метод IndexOf возвращает позицию первого вхождения заданного символа или подстроки (или -1 если символ или подстрока не найдены):

Методы StartsWith , EndsWith и IndexOf перегружены и могут принимать enum StringComparison или объект CultureInfo , чтобы управлять чувствительность к регистру и культуре:

Метод IndexOf также может принимать startPosition — индекс, с которого должен начинаться поиск.

Метод LastIndexOf похож на IndexOf , но ищет начиная с конца строки.

Метод IndexOfAny возвращает позицию первого вхождения любого символа из набора, а метод LastIndexOfAny делает тоже самое в обратном направлении:

Строковые операции

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

  • Substring — извлекает часть строки
  • Insert и Remove — вставляют и удаляют символы в указанную позицию
  • PadLeft и PadRight — добавляют пробелы в начали и конце строки
  • TrimStart , TrimEnd , и Trim удаляют пробелы
  • ToUpper и ToLower — преобразуют строку в верхний или нижний регистр
  • Split — разбивает строку на подстроки по переданному разделителю
  • Join — объединяет подстроки в строку

Конструирование строк

Простейший способ создать строку — это присвоение литерала:

Чтобы создать строку из повторяющейся последовательности символов можно использовать конструктор string :

Строку можно сконструировать из массива char . Метод ToCharArray делает обратное:

null и пустые строки

Чтобы создать пустую строку можно использовать литерал, либо статическое поле string.Empty . Пустая строка имеет нулевую длину и ее свойство Length равно нулю:

Поскольку строки являются ссылочными типами они могут принимать значение null :

Статический метод string.IsNullOrEmpty позволяет проверить является ли строка null или пустой.

Методы манипулирования строками

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

Метод Substring извлекает часть строки:

Методы Insert и Remove вставляют либо удаляют символы в указанной позиции:

Методы PadLeft и PadRight дополняют строку до заданной длины слева или справа указанным символом или пробелом если символ не указан. Если входная строка длиннее заданной длины для дополнения, исходная строка возвращается неизмененной:

Методы TrimStart и TrimEnd удаляют указанные символы с начала или конца строки, а метод Trim с двух сторон. Если символ для удаления не указан, удаляется пробельные символы:

Метод Replace заменяет все непересекающиеся вхождения заданного символа или подстроки на другой символ или строку:

Методы ToUpper и ToLower возвращают версию входной строки в верхнем или нижнем регистре с учетом языковых настроек пользователя, а методы ToUpperInvariant и ToLowerInvariant без их учета.

Объединение и разбиение строк

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

Статический метод Join выполняет действие противоположное методу Split . Он требует указания разделителя и строкового массива.

Статический метод Concat похож на Join , но принимает только строковой массив без разделителя. Он полностью эквивалентен операции + :

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

При сравнении строк применяются два базовых алгоритма:

  • ординальное сравнение — символы интерпретируются как числа согласно их числовым кодам в Unicode
  • сравнение чувствительно к культуре — символы интерпретируются со ссылкой на конкретный язык. Существует две специальные культуры: текущая культура — культура заданная в настройках конкретной машины; инвариантная культура — одинакова для всех компьютеров (американская культура)

Для сравнения эквивалентности строк можно использовать оператор == или один из методов Equals типа string . Последний существует в двух вариантах: статический и экземплярный. Статически метод полезен тем, что он работает, когда одна или обе строки равны null :

Оператор == и метод string.Equals вызванный без параметров всегда выполняют ординальное сравнение, чувствительное к регистру. Метод string.Equals вызванный с дополнительным параметром StringComparison comparisonType может выполнять сравнение с учетом культуры и нечувствиетльное к регистру. StringComparison определен следующим образом:

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

Метод CompareTo выполняет чувствительное к культуре и регистру сравнение. Методы Compare и CompareOrdinal в зависимости от переданных аргументов могут выполнять разные виды сравнения:

StringBuilder

Класс System.Text.StringBuilder представляет изменяемую (редактируемую) строку. С его помощью можно добавлять (метод Append ), вставлять ( Insert ), удалять ( Remove ) и заменять ( Replace ) подстроки, не заменяя целиком StringBuilder . Конструктор StringBuilder дополнительно может принимать начальное значение строки, а также стартовую длину строки (по умолчанию 16 символов). Использование класса StringBuilder для построения строк более эффективно, чем выполнение множества конкатенаций строк.

Метод AppendLine добавляет подстроку и завершает ее символами новой строки ( \r\n ). Метод AppendFormat принимает смешанную форматную строку точно как String.Format . Класс StringBuilder также содержит свойство Length и индексатор для получения и установки отдельных символов.

Для очистки содержимого StringBuilder нужно либо создать новый экземпляр, либо установить его свойство Length равным 0 (последний вариант не уменьшит объем занимаемой памяти).

Кодировка

Стандартной кодировкой .NET для символов и строк является UTF-16, а для потокового ввода-вывода — UTF-8.

Класс System.Text.Encoding является базовым классом для типов, инкапсулирующих кодировки текста. Создать экземпляр Encoding можно с помощью статического метода Encoding.GetEncoding , передав ему стандартное имя IANA:

Экземпляры наиболее распространенных кодировок также могут быть получены через статические свойства Encoding :

Статический метод GetEncodings возвращает список всех поддерживаемых кодировок:

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

Форматирование и разбор (Formatting and Parsing)

Форматирование — преобразование в строку, разбор (парсинг) — преобразование из строки.

Методы ToString и Parse

Методы ToString и Parse являются стандартным механизмом для форматирования и разбора строк. ToString обеспечивает осмысленный вывод для всех простых значимых типов ( bool , DateTime , DateTimeOffset , TimeSpan , Guid и всех числовых типов). Для обратной операции в каждом из указанных типов определен статический метод Parse :

Метод Parse генерирует исключение FormatException в случае неудачной попытки разбора. Многие типы также определяют метод TryParse , который в случае неудачной попытки разбора возвращает false вместо генерации исключения.

Методы ToString , Parse и TryParse для числовых типов и классов DateTime и DateTimeOffset учитывают местные настройки культуры. Также им можно передать объект CultureInfo , содержащий иные настройки культуры, которые будут использованы вместо местных:

Интерфейс IFormattable

Метод ToString числовых типов и типов DateTime / DateTimeOffset реализует интерфейс IFormattable — стандартный интерфейс для поддержки форматных строк и поставщиков форматов:

В связи с этим метод ToString указанных типов может принимать в качестве дополнительных аргументов форматную строку и/или поставщиков форматов. Форматная строка предоставляет инструкции, поставщик формата определяет, как эти инструкции должны применяться:

В примере «C» — форматная строка, которая означает денежное значение (currency), а объект NumberFormatInfo — поставщик формата, определяющий, как должно визуализироваться денежное значение.

Если для форматной строки и поставщика указать null , будут использованы стандартные варианты. Стандартный поставщик формата — CultureInfo.CurrentCulture , который отражает настройки панели управления компьютера во время выполнения:

Для удобства большинство типов перегружаю метод ToString , чтобы null для поставщика можно было не указывать:

Вызов ToString без аргументов эквивалентен использованию стандартного поставщика формата с пустой форматной строкой.

Форматная строка

Существует два вида форматных строк:

  • стандартные форматные строки — обеспечивают общее управление форматированием при преобразовании числа или даты/времени в строку; состоят из одной буквы, за которой может следовать цифра
  • специальные форматные строки — позволяют контролировать при форматировании каждый символ с помощью шаблона, сотоящего из произвольного количества предопределенных символов

Подробно форматные строки для чисел и даты/времени рассматриваются в разделах, посвященных этим типам.

Поставщики форматов (Format Providers)

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

  • NumberFormatInfo
  • DateTimeFormatInfo
  • CultureInfo

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

В контексте поставщиков формата CultureInfo представляет собой механизм косвенного обращения к двум другим поставщикам формата — NumberFormatInfo или DateTimeFormatInfo . Он возвращает NumberFormatInfo или DateTimeFormatInfo применимый к региональным настройкам культуры:

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *