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

Что не так с ToLowerInvariant()?

У меня есть следующая строка кода:

var connectionString = configItems.
                Find(item => item.Name.ToLowerInvariant() == "connectionstring");

Анализ кода VS 2010 говорит мне следующее:

Предупреждение 7 CA1308: Microsoft.Globalization: В методе... замените вызов на string.ToLowerInvariant() с помощью String.ToUpperInvariant().

Означает ли это, что ToUpperInvariant() более надежна?

4b9b3361

Ответ 1

Google дает подсказку, указывающую на CA1308: нормализовать строки в верхнем регистре

В нем говорится:

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

Итак, да - ToUpper более надежный, чем ToLower.

В будущем я предлагаю googling в первую очередь - я делаю это для всех этих предупреждений FxCop, которые меня бросают;) Помогает многое прочитать соответствующую документацию;)

Ответ 2

Кроме того, что TomTom говорит,.net оптимизирован для сравнения строк в верхнем регистре. Поэтому использование верхнего инварианта теоретически быстрее, чем нижнеинвариантный.

Это действительно указано в CLR через С#, как указано в комментариях. Следующая ссылка цитирует эту часть книги. Я не уверен, действительно ли это действительно так, поскольку в MSDN ничего не найдено об этой теме. В руководстве сравнения строк на msdn упоминается, что toupperinvariant и tolowerinvariant равны и не предпочитают первого.

Сравнение строк в С#