Язык программирования C#9 и платформа .NET5
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описаны в табл. 3.7.StringComparisonЧтобы взглянуть на результаты применения
, создайте новый метод по имени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));
