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

Хэш-код используется для коллекций на основе хэша, таких как Dictionary, Hashtable, HashSet и т. д. Цель этого кода - очень быстро предварительно сортировать конкретный объект, помещая его в определенную группу (ведро). Эта предварительная сортировка очень помогает в поиске этого объекта, когда вам нужно вернуть его из коллекции хешей, потому что код должен искать ваш объект только в одном ведро, а не во всех его объектах. Лучшее распределение хэш-кодов (лучшая уникальность) - более быстрое извлечение. В идеальной ситуации, когда каждый объект имеет уникальный хеш-код, поиск его является операцией O (1). В большинстве случаев он приближается к O (1).

33
задан Dan Esparza 6 January 2009 в 20:19
поделиться

2 ответа

Microsoft дает некоторые достойные указания для того, когда использовать InvariantCulture свойство:

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

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

Соображения безопасности

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

Строковые операции

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

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

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

27
ответ дан Bern 11 October 2019 в 08:33
поделиться

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

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

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

32
ответ дан Jon Skeet 11 October 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: