string.ToLower () и string.ToLowerInvariant ()

164

Какая разница и когда использовать что? Какой риск, если я всегда использую, ToLower()и каков риск, если я всегда использую ToLowerInvariant()?

Луис Рис
источник
4
Возможно, вам следует вместо этого нормализовать строки в верхний регистр. См. Msdn.microsoft.com/en-us/library/bb386042.aspx
habakuk

Ответы:

149

В зависимости от текущей культуры ToLower может выдавать строчную букву конкретной культуры, которую вы не ожидаете. Такие как создание ınfoбез точки на i вместо infoи, таким образом, запутывание сравнений строк. По этой причине ToLowerInvariant следует использовать для любых данных, не зависящих от языка. Когда у вас может быть пользовательский ввод, который может быть на их родном языке / наборе символов, как правило, это единственный раз, когда вы используете ToLower.

Посмотрите этот вопрос для примера этой проблемы: C # - ToLower () иногда удаляет точку из буквы «I»

AaronLS
источник
45

Я думаю, что это может быть полезно:

http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx

Обновить

Если ваше приложение зависит от случая, когда строка изменяется предсказуемым образом, на который не влияет текущая культура, используйте метод ToLowerInvariant. Метод ToLowerInvariant эквивалентен методу ToLower (CultureInfo.InvariantCulture). Этот метод рекомендуется, когда коллекция строк должна отображаться в предсказуемом порядке в элементе управления пользовательского интерфейса.

также

... ToLower очень похож в большинстве мест на ToLowerInvariant. Документы указывают, что эти методы только изменят поведение с турецкими культурами. Кроме того, в системах Windows файловая система нечувствительна к регистру, что еще больше ограничивает ее использование ...

http://www.dotnetperls.com/tolowerinvariant-toupperinvariant

НТН

danyolgiax
источник
@danyolgiax Пожалуйста, не могли бы вы рассказать подробнее? не могу вывести его удобство из ссылки MSDN. Спасибо
Прерак К
2
да ToLowerInvariant не работает на турецком языке, как ожидалось. İ становится ı
MonsterMMORPG
28

String.ToLower()использует культуру по умолчанию, в то время как String.ToLowerInvariant()использует инвариантную культуру. Таким образом, вы по сути спрашиваете разницу между инвариантной культурой и порядковым сравнением строк .

Ченг Чен
источник
Нет, он не «Порядковый» - это третий вариант - немного другой способ «игнорировать» текущую культуру. Различие не актуально при обсуждении ToLowerвариантов; Порядковый и инвариантный только изменяет «порядок сортировки» двух строк, не меняет сравнение на равенство.
ToolmakerSteve
28

TL; DR:

При работе с «контентом» (например, статьями, постами, комментариями, именами, местами и т. Д.) Используйте ToLower(). При работе с «литералами» (например, аргументы командной строки, пользовательские грамматики, строки, которые должны быть перечислениями и т. Д.) ИспользуйтеToLowerInvariant() .

Примеры:

= Использование ToLowerInvariantнеправильно =

В DIŞпереводе с турецкого означает «снаружи» и dişозначает «зуб». Правильный нижний кожух DIŞесть dış. Итак, если вы используетеToLowerInvariant неправильно, вы можете иметь опечатки в Турции.

= Использование ToLowerнеправильно =

Теперь представьте, что вы пишете анализатор SQL. Где-то у вас будет код, который выглядит следующим образом:

if(operator.ToLower() == "like")
{
  // Handle an SQL LIKE operator
}

Грамматика SQL не меняется при изменении культур. Француз не пишет SÉLECTIONNEZ x DE booksвместо SELECT X FROM books. Однако для того, чтобы вышеприведенный код работал, турецкому человеку нужно было бы написать SELECT x FROM books WHERE Author LİKE '%Adams%'(обратите внимание на точку над заглавной буквой i, которую почти невозможно увидеть). Это было бы довольно сложно для вашего турецкого пользователя.

аллюр
источник