Использование InvariantCultureIgnoreCase вместо ToUpper для сравнения строк без учета регистра

В на этой странице комментатор пишет:

Никогда не используйте .ToUpper, чтобы гарантировать, что сравнение строк нечувствительно к регистру.

Вместо этого:

type.Name.ToUpper() == (controllerName.ToUpper() + "Controller".ToUpper())) 

Сделайте это:

type.Name.Equals(controllerName + "Controller", 
     StringComparison.InvariantCultureIgnoreCase)

Почему этот способ предпочтительнее?

Ответы

Ответ 1

Вот ответ в деталях. Турнирский тест (прочитайте раздел 3)

Как обсуждалось много и много люди, "я" на турецком языке ведут себя иначе, чем на большинстве языков. По стандарту Юникода наши нижний регистр "i" становится "İ" (U + 0130 "Письмо Латинской столицы я с точкой Выше" ), когда он перемещается в верхний регистр. Точно так же наш верхний регистр "I" становится "ı" (U + 0131 "Латинское маленькое письмо Dotless я" ), когда он переходит к в нижнем регистре.

Исправить: снова используйте порядковый номер (исходный байт) сравнения или инвариантной культуры для сравнений, если вам абсолютно не нужно культурно-языковая лингвистическая сравнения (которые дают заглавные буквы Я с точками в Турции)

И в соответствии с Microsoft вы даже не должны использовать Invariant... но Ordinal... (Новые рекомендации по использованию строк в Microsoft.NET 2.0)

Ответ 2

Короче говоря, он оптимизирован с помощью CLR (меньше памяти).

Кроме того, сравнение в верхнем регистре более оптимизировано, чем ToLower(), если эта незначительная степень производительности имеет значение.

В ответ на ваш пример есть еще быстрее:

String.Equals(type.Name, controllerName + "Controller", 
              StringComparison.InvariantCultureIgnoreCase);