string.ToLower () и string.ToLowerInvariant () - PullRequest
142 голосов
/ 03 июня 2011

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

Ответы [ 4 ]

121 голосов
/ 05 ноября 2013

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

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

43 голосов
/ 03 июня 2011

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

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

НТН

27 голосов
/ 03 июня 2011

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

12 голосов
/ 31 мая 2018

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, которую почти невозможно увидеть).Это было бы довольно сложно для вашего турецкого пользователя.

...