Что не так с ToLowerInvariant()?
У меня есть следующая строка кода:
var connectionString = configItems.
Find(item => item.Name.ToLowerInvariant() == "connectionstring");
Анализ кода VS 2010 говорит мне следующее:
Предупреждение 7 CA1308: Microsoft.Globalization: В методе... замените вызов на string.ToLowerInvariant() с помощью String.ToUpperInvariant().
Означает ли это, что ToUpperInvariant()
более надежна?
Ответы
Ответ 1
Google дает подсказку, указывающую на CA1308: нормализовать строки в верхнем регистре
В нем говорится:
Строки должны быть нормализованы в верхнем регистре. Небольшая группа символов, когда они преобразуются в нижний регистр, не может совершить кругосветное путешествие. Чтобы сделать путешествие в оба конца, нужно преобразовать символы из одной локали в другую локаль, которая представляет символьные данные по-разному, а затем для точного извлечения исходных символов из преобразованных символов.
Итак, да - ToUpper более надежный, чем ToLower.
В будущем я предлагаю googling в первую очередь - я делаю это для всех этих предупреждений FxCop, которые меня бросают;) Помогает многое прочитать соответствующую документацию;)
Ответ 2
Кроме того, что TomTom говорит,.net оптимизирован для сравнения строк в верхнем регистре. Поэтому использование верхнего инварианта теоретически быстрее, чем нижнеинвариантный.
Это действительно указано в CLR через С#, как указано в комментариях.
Следующая ссылка цитирует эту часть книги. Я не уверен, действительно ли это действительно так, поскольку в MSDN ничего не найдено об этой теме. В руководстве сравнения строк на msdn упоминается, что toupperinvariant и tolowerinvariant равны и не предпочитают первого.
Сравнение строк в С#