Сравнение строк в C #: разница между CurrentCultureIgnoreCase и InvariantCultureIgnoreCase - PullRequest
33 голосов
/ 06 января 2009

При сравнении строк в C #, в чем разница между

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);

и

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);

... и так ли важно включить этот дополнительный параметр?

Ответы [ 2 ]

31 голосов
/ 06 января 2009

Другие посты дали хороший совет, но я подумал, что было бы неплохо показать пример, где это определенно имеет значение:

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));
    }
}

(Несомненно, существует много других случаев - это был только первый случай, о котором я подумал.)

27 голосов
/ 06 января 2009

Microsoft дает приличное руководство по использованию свойства InvariantCulture:

MSDN: CultureInfo.InvariantCulture Property

... приложение должно использовать инвариантная культура только для процессов которые требуют независимости от культуры результаты, такие как форматирование и анализ данных, которые сохраняются в файл. В других случаях это производит результаты, которые могут быть лингвистически неправильно или неуместно в культурном отношении.

Вопросы безопасности

Если будет принято решение о безопасности на основе результата строки сравнение или изменение случая, ваш приложение должно использовать порядковый номер Сравнение, которое игнорирует регистр вместо использования InvariantCulture. [...]

Операции со строками

Если ваше приложение должно выполнить чувствительная к культуре операция это не зависит от стоимости CurrentCulture, он должен использовать метод который принимает параметр CultureInfo. [...]

Постоянные данные

Свойство InvariantCulture: полезно для хранения данных, которые не будут отображаться непосредственно пользователям. Хранение данных в независимой от культуры Формат гарантирует известный формат, который не меняется. Когда пользователи из разные культуры имеют доступ к данным, это может быть отформатирован соответствующим образом на конкретного пользователя. [...]

...