Использование InvariantCultureIgnoreCase вместо ToUpper для сравнения строк без учета регистра - PullRequest
14 голосов
/ 13 февраля 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

17 голосов
/ 13 февраля 2010

Вот ответ в деталях .. Тест Турции ( читать раздел 3 )

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

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

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

8 голосов
/ 13 февраля 2010

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

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

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

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