Сравнение строк C #:Разница между CurrentCultureIgnoreCase и InvariantCultureIgnoreCase
-
03-07-2019 - |
Вопрос
При выполнении сравнения строк в C #, в чем разница между выполнением
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);
и
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);
...и в любом случае, важно ли включать этот дополнительный параметр?
Решение
Корпорация Майкрософт дает несколько достойных рекомендаций относительно того, когда следует использовать InvariantCulture
свойство:
MSDN:CultureInfo.Инвариантное свойство Culture
...приложение должно использовать инвариантный язык и региональные параметры только для процессов что требуется культуры-независимый результаты, такие как форматирование и анализируя данные, которые сохранены на файл.В других случаях это приводит к результатам, которые могут быть лингвистически неверными или культурно неприемлемыми.
Соображения безопасности
Если будет принято решение о безопасности на основе результата строки сравнения или изменения регистра, ваше приложение должно использовать порядковый номер сравнение, которое игнорирует регистр вместо использования InvariantCulture.[...]
Операции со строками
Если вашему приложению необходимо выполнить зависящую от языка операцию со строкой на которую не влияет значение CurrentCulture, оно должно использовать метод который принимает параметр CultureInfo.[...]
Сохраняющиеся данные
Свойство InvariantCulture полезно для хранения данных, которые не будут отображаться непосредственно пользователям.Хранение данных в независимом от языка формате гарантирует известный формат, который не изменяется.Когда пользователи из разных культур получают доступ к данным, они могут быть соответствующим образом отформатированы на основе конкретного пользователя.[...]
Другие советы
В других постах были даны хорошие советы, но я подумал, что было бы неплохо показать пример того, где это определенно имеет значение:
using System;
using System.Globalization;
using System.Threading;
class Test
{
static void Main()
{
CultureInfo turkish = CultureInfo.CreateSpecificCulture("tr");
Thread.CurrentThread.CurrentCulture = turkish;
// In Turkey, "i" does odd things
string lower = "i";
string upper = "I";
Console.WriteLine(lower.Equals(upper,
StringComparison.CurrentCultureIgnoreCase));
Console.WriteLine(lower.Equals(upper,
StringComparison.InvariantCultureIgnoreCase));
}
}
(Без сомнения, есть много других случаев - это был только первый, о котором я подумал.)