Разница между строкой.Compare и CompareInfo от CultureInfo

#c# #string #globalization #cultureinfo

#c# #строка #глобализация #cultureinfo

Вопрос:

Я пробовал свои силы в системе.Глобализация в небольшом настольном приложении. Я немного смущен дополнительным контролем, который CultureInfo.Compare() может предложить, чем использование String.Compare() метода и его перегрузок.

Допустим, у меня есть две строки

 String s1 = "u3057u3093u304Bu3093u305bu3093"; //some Japanese text in Unicode
String s2 = "u30b7u3043u30abu30f3u30bbu30f3"; //Some Japanese text in Unicode
CultureInfo ci = new CultureInfo("ja-JP");
  

String.Compare имеет несколько перегрузок, из которых в настоящее время я бы использовал

String.Compare(String strA, String strB, CultureInfo culture, CompareOptions options)

(где CompareOptions — перечисляемый тип)

Однако я мог бы также использовать:

 CompareInfo compareInfo = CompareInfo.GetCompareInfo("ja-JP");
compareInfo.Compare(String strA, String strB, CompareOptions options);
  

для той же цели.

Как объект CompareInfo от CultureInfo обеспечивает больший контроль при обработке такой ситуации в глобализации, такой как японский текст, например: CompareOptions.IgnoreKanaType (где Kana — это вторая форма японского языка, которую можно игнорировать из строки, используя CompareOptions enumaerated type).

Ответ №1:

Я считаю, что String.Compare будет просто делегировать то, что CompareInfo предусмотрено — просто удобнее не доставать CompareInfo самостоятельно.

Учитывая, что они делают одно и то же, я не уверен, что на самом деле означает ваш последний вопрос.

Ответ №2:

Да, Джон Скит прав, String.Compare внутренне вызывает метод CultureInfo.Compare, вот фактический код из IL:

     public static int Compare(string strA, string strB, CultureInfo culture, CompareOptions options)
{
    if (culture == null)
    {
        throw new ArgumentNullException("culture");
    }
    return culture.CompareInfo.Compare(strA, strB, options);
}
  

Еще одна вещь, на которую следует обратить внимание, заключается в том, что метод CultureInfo.Compare внутренне не проверяет (сначала), является ли ввод (культура) нулевым или нет. Он просто напрямую выполняет другую операцию. Также он снова вызывает string.Сравнить(строка,string,StringOptions) API, если используется OrdinalIgnoreCase.
Поэтому лучше всего использовать String.Сравните, поскольку перед выполнением любой операции выполняется проверка на нуль.