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

На этом страницу, комментатор пишет:

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

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

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

Сделай это:

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

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


person Robert Harvey    schedule 13.02.2010    source источник


Ответы (2)


Вот подробный ответ .. Тест Турции (прочитайте раздел 3)

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

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

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

person Gabriele Petrioli    schedule 13.02.2010
comment
Спасибо... Я подозревал что-то подобное. Раздражает, когда люди говорят, что вы ДОЛЖНЫ делать что-то определенным образом, но не говорят, ПОЧЕМУ. - person Robert Harvey; 13.02.2010
comment
.. тоже не люблю диктатуры .. лол .. (добавлена ​​ссылка на рекомендации Microsoft) - person Gabriele Petrioli; 13.02.2010
comment
Я также заметил небольшое улучшение производительности при выполнении сравнения без учета регистра по сравнению с преобразованием в верхний/нижний регистр, поэтому использование флага сравнения, безусловно, правильный путь... - person Chris R. Donnelly; 26.11.2010
comment
Это забавно, потому что Microsoft долгое время рекомендовала использовать ToUpper вместо ToLower именно по этой причине. Мне всегда трудно найти его, но он есть на сайте MSDN. ... А может быть, это уже не так. редактировать: Нашел! msdn.microsoft.com/en-us/library/bb386042.aspx. Кто-нибудь может объяснить? - person Brent Rittenhouse; 06.09.2017

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

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

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

String.Equals(type.Name, controllerName + "Controller", 
              StringComparison.InvariantCultureIgnoreCase);
person Nick Craver    schedule 13.02.2010
comment
Нет никаких соображений о странностях, таких как умлауты или что-то в этом роде? Значит, этот парень просто был диктатором? - person Robert Harvey; 13.02.2010
comment
@Robert - Есть дополнительные преимущества, такие как бесплатная проверка на ноль, о которой вам не нужно беспокоиться, но в основном это разница в оптимизации ... строки высоко оптимизированы CLR, поэтому воспользуйтесь преимуществами Встроенные ярлыки CLR могут значительно повысить производительность, если вы выполняете этот код в тяжелом цикле. Кроме того, это также уменьшит нагрузку на память. - person Nick Craver; 13.02.2010