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

StackOverflow https://stackoverflow.com/questions/417954

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top