Бөлісу құралы:


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

Методы String.ToUpper, String.ToLower, Char.ToUpper и Char.ToLower имеют перегрузки, которые не принимают никаких параметров. По умолчанию эти перегрузки без параметров выполняют изменения регистра в зависимости от значения CultureInfo.CurrentCulture. Это создает результаты с учетом регистра, которые могут отличаться в зависимости от культуры. Чтобы уточнить, хотите ли вы, чтобы изменения регистра учитывали или не учитывали культуру, следует использовать перегрузки этих методов, которые требуют явного указания параметра culture. Для учета культурных особенностей при изменении регистра укажите параметр CultureInfo.CurrentCulture для culture. Для изменений регистра, не зависящих от языка и региональных параметров, укажите CultureInfo.InvariantCulture для culture параметра.

Часто строки преобразуются в стандартный регистр, чтобы упростить поиск позже. Если строки используются таким образом, следует указать CultureInfo.InvariantCulture для culture параметра, так как значение Thread.CurrentCulture потенциально может измениться между временем изменения регистра и временем подстановки.

Если решение безопасности основано на операции изменения регистра, операция должна быть не учитывающей языковые и региональные параметры, чтобы убедиться, что значение CultureInfo.CurrentCulture не влияет на результат. См. раздел "Сравнение строк, использующих текущий язык и региональные параметры" статьи "Рекомендации по использованию строк" , где показано, как операции строки с учетом языка и региональных параметров могут привести к несогласованным результатам.

String.ToUpper и String.ToLower

Для ясности кода рекомендуется всегда использовать перегрузки методов String.ToUpper и String.ToLower, которые позволяют явно указывать язык и культуру. Например, следующий код выполняет поиск идентификатора. Операция key.ToLower учитывает язык и региональные параметры по умолчанию, но это поведение не очевидно при чтении кода.

Пример

Shared Function LookupKey(key As String) As Object
   Return internalHashtable(key.ToLower())
End Function
static object LookupKey(string key)
{
    return internalHashtable[key.ToLower()];
}

Если вы хотите, чтобы операция key.ToLower была нечувствительна к языковым и региональным настройкам, измените предыдущий пример следующим образом, чтобы явно использовать CultureInfo.InvariantCulture при изменении регистра.

Shared Function LookupKey(key As String) As Object
    Return internalHashtable(key.ToLower(CultureInfo.InvariantCulture))
End Function
static object LookupKey(string key)
{
    return internalHashtable[key.ToLower(CultureInfo.InvariantCulture)];
}

Char.ToUpper и Char.ToLower

Char.ToUpper Хотя методы Char.ToUpper и Char.ToLower имеют те же характеристики, что и методы String.ToUpper и String.ToLower, единственные затронутые культуры — турецкая (Türkiye) и азербайджанская (латиница, Азербайджан). Это единственные две культуры с различиями в регистре одного символа. Дополнительные сведения об этом уникальном сопоставлении регистров см. в разделе "Casing" в документации по классам String . Для ясности кода и обеспечения согласованных результатов рекомендуется всегда использовать перегруженные версии методов с параметром CultureInfo.

См. также