Какая разница и когда использовать что? Какой риск, если я всегда использую, ToLower()
и каков риск, если я всегда использую ToLowerInvariant()
?
Какая разница и когда использовать что? Какой риск, если я всегда использую, ToLower()
и каков риск, если я всегда использую ToLowerInvariant()
?
Ответы:
В зависимости от текущей культуры ToLower может выдавать строчную букву конкретной культуры, которую вы не ожидаете. Такие как создание ınfo
без точки на i вместо info
и, таким образом, запутывание сравнений строк. По этой причине ToLowerInvariant следует использовать для любых данных, не зависящих от языка. Когда у вас может быть пользовательский ввод, который может быть на их родном языке / наборе символов, как правило, это единственный раз, когда вы используете ToLower.
Посмотрите этот вопрос для примера этой проблемы: C # - ToLower () иногда удаляет точку из буквы «I»
Я думаю, что это может быть полезно:
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
НТН
String.ToLower()
использует культуру по умолчанию, в то время как String.ToLowerInvariant()
использует инвариантную культуру. Таким образом, вы по сути спрашиваете разницу между инвариантной культурой и порядковым сравнением строк .
ToLower
вариантов; Порядковый и инвариантный только изменяет «порядок сортировки» двух строк, не меняет сравнение на равенство.
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, которую почти невозможно увидеть). Это было бы довольно сложно для вашего турецкого пользователя.