Подтвердить что ты не робот

С# Сравнение строк: разница между CurrentCultureIgnoreCase и InvariantCultureIgnoreCase

При сравнении строк в С# в чем разница между выполнением

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

и

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

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

4b9b3361

Ответ 1

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

MSDN: свойство CultureInfo.InvariantCulture

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

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

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

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

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

Сохраняющиеся данные

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

Ответ 2

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

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

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