Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

static void StringEquality

{

Console.WriteLine("=> String equality:");

string s1 = "Hello!";

string s2 = "Yo!";

Console.WriteLine("s1 = {0}", s1);

Console.WriteLine("s2 = {0}", s2);

Console.WriteLine;

// Проверить строки на равенство.

Console.WriteLine("s1 == s2: {0}", s1 == s2);

Console.WriteLine("s1 == Hello!: {0}", s1 == "Hello!");

Console.WriteLine("s1 == HELLO!: {0}", s1 == "HELLO!");

Console.WriteLine("s1 == hello!: {0}", s1 == "hello!");

Console.WriteLine("s1.Equals(s2): {0}", s1.Equals(s2));

Console.WriteLine("Yo!.Equals(s2): {0}", "Yo!".Equals(s2));

Console.WriteLine;

}

Операции

равенства C# выполняют в отношении объектов
string
посимвольную проверку равенства с учетом регистра и нечувствительную к культуре. Следовательно, строка
"Hello!"
не равна строке
"HELLO!"
и также отличается от строки
"hello!"
. Кроме того, памятуя о связи между
string
и
System.String
, проверку на предмет равенства можно осуществлять с использованием метода
Equals
класса
String
и других поддерживаемых им операций равенства. Наконец, поскольку каждый строковый литерал (такой как
"Yo!"
) является допустимым экземпляром
System.String
, доступ к функциональности, ориентированной на работу со строками, можно получать для фиксированной последовательности символов.

Модификация поведения сравнения строк

Как уже упоминалось, операции равенства строк (

Compare
,
Equals
и
==
), а также функция
IndexOf
по умолчанию чувствительны к регистру символов и нечувствительны к культуре. Если ваша программа не заботится о регистре символов, тогда может возникнуть проблема. Один из способов ее преодоления предполагает преобразование строк в верхний или нижний регистр с последующим их сравнением:

if (firstString.ToUpper == secondString.ToUpper)

{

// Делать что-то

}

Здесь создается копия каждой строки со всеми символами верхнего регистра. В большинстве ситуаций это не проблема, но в случае очень крупных строк может пострадать производительность. И дело даже не производительности — написание каждый раз такого кода преобразования становится утомительным. А что, если вы забудете вызвать

ToUpper
? Результатом будет трудная в обнаружении ошибка.

Гораздо лучший прием предусматривает применение перегруженных версий перечисленных ранее методов, которые принимают значение перечисления

StringComparison
, управляющего выполнением сравнения. Значения
StringComparison
описаны в табл. 3.7.

Чтобы взглянуть на результаты применения

StringComparison
,
создайте новый метод по имени
StringEqualitySpecifyingCompareRules
со следующим кодом:

static void StringEqualitySpecifyingCompareRules

{

Console.WriteLine("=> String equality (Case Insensitive:");

string s1 = "Hello!";

string s2 = "HELLO!";

Console.WriteLine("s1 = {0}", s1);

Console.WriteLine("s2 = {0}", s2);

Console.WriteLine;

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

Console.WriteLine("Default rules: s1={0},s2={1}s1.Equals(s2): {2}",

s1, s2,
s1.Equals(s2));

Console.WriteLine("Ignore case: s1.Equals(s2,

StringComparison.OrdinalIgnoreCase): {0}",

s1.Equals(s2, StringComparison.OrdinalIgnoreCase));

Console.WriteLine("Ignore case, Invariant Culture: s1.Equals(s2,

StringComparison.
InvariantCultureIgnoreCase): {0}",

s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase));

Console.WriteLine;

Console.WriteLine("Default rules: s1={0},s2={1} s1.IndexOf(\"E\"): {2}",

s1, s2,
s1.IndexOf("E"));

Console.WriteLine("Ignore case: s1.IndexOf(\"E\",

StringComparison.OrdinalIgnoreCase):

{0}", s1.IndexOf("E",

StringComparison.OrdinalIgnoreCase));

Console.WriteLine("Ignore case, Invariant Culture: s1.IndexOf(\"E\",

StringComparison.
InvariantCultureIgnoreCase): {0}",

s1.IndexOf("E", StringComparison.InvariantCultureIgnoreCase));

Console.WriteLine;

}

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

StringComparison
становится обязательным.

Строки неизменяемы

Один из интересных аспектов класса

System.String
связан с тем, что после присваивания объекту string начального значения символьные данные не могут быть изменены. На первый взгляд это может показаться противоречащим действительности, ведь строкам постоянно присваиваются новые значения, а в классе
System.String
доступен набор методов, которые, похоже, только то и делают, что изменяют символьные данные тем или иным образом (скажем, преобразуя их в верхний или нижний регистр). Тем не менее, присмотревшись внимательнее к тому, что происходит "за кулисами", вы заметите, что методы типа
string
на самом деле возвращают новый объект
string
в модифицированном виде:

Поделиться:
Популярные книги

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4