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

на главную

Жанры

Язык программирования 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. Александр Агренев
Фантастика:
альтернативная история
9.28
рейтинг книги
На границе тучи ходят хмуро...

Энфис. Книга 1

Кронос Александр
1. Эрра
Фантастика:
боевая фантастика
рпг
5.70
рейтинг книги
Энфис. Книга 1

Я – Орк. Том 4

Лисицин Евгений
4. Я — Орк
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я – Орк. Том 4

Совок-8

Агарев Вадим
8. Совок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Совок-8

Я снова не князь! Книга XVII

Дрейк Сириус
17. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я снова не князь! Книга XVII

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Адепт: Обучение. Каникулы [СИ]

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.15
рейтинг книги
Адепт: Обучение. Каникулы [СИ]

Огненный князь 6

Машуков Тимур
6. Багряный восход
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Огненный князь 6

Как я строил магическую империю 2

Зубов Константин
2. Как я строил магическую империю
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю 2

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание

Безымянный раб

Зыков Виталий Валерьевич
1. Дорога домой
Фантастика:
фэнтези
9.31
рейтинг книги
Безымянный раб

Матабар. II

Клеванский Кирилл Сергеевич
2. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар. II

Виконт. Книга 2. Обретение силы

Юллем Евгений
2. Псевдоним `Испанец`
Фантастика:
боевая фантастика
попаданцы
рпг
7.10
рейтинг книги
Виконт. Книга 2. Обретение силы

Первый пользователь. Книга 3

Сластин Артем
3. Первый пользователь
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Первый пользователь. Книга 3