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

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

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

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

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

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

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

Почему этот путь предпочтен?

14
задан Robert Harvey 13 February 2010 в 05:22
поделиться

2 ответа

Вот ответ в деталях .. The Turkey Test ( прочтите раздел 3 )

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

Исправление : снова используйте порядковый (необработанный байт) компаратор или инвариантную культуру для сравнений, если вам не требуется лингвистический {{1} } сравнения (которые дают вам прописные I с точками в Турции)

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

17
ответ дан 1 December 2019 в 11:59
поделиться

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

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

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

String.Equals(type.Name, controllerName + "Controller", 
              StringComparison.InvariantCultureIgnoreCase);
8
ответ дан 1 December 2019 в 11:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: