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

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

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

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

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 Хотя и методы имеют те же характеристики, что String.ToUpper и String.ToLowerChar.ToLower методы, единственные затронутые культуры являются турецкими (Türkiye) и азербайджанцами (латиница, Азербайджан). Только для этих значений языка и региональных параметров изменяется применение регистра для одиночных символов. Дополнительные сведения об этом уникальном сопоставлении регистров см. в разделе "Casing" в документации по классам String . Для ясности кода и обеспечения согласованных результатов рекомендуется всегда использовать перегрузки этих методов, которые принимают CultureInfo параметр.

См. также