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

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

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

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

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

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


person JL.    schedule 10.05.2010    source источник
comment
Однако обратите внимание, что использование string.Equals(item.Name, "connectionstring", StringComparison.OrdinalIgnoreCase), вероятно, является лучшим подходом в данном конкретном случае.   -  person Greg Beech    schedule 10.05.2010


Ответы (2)


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

Он говорит:

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

Так что да - ToUpper надежнее ToLower.

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

person TomTom    schedule 10.05.2010
comment
+1 за Очень помогает прочитать соответствующую документацию (а также за то, что она абсолютно правильная ...) - person gehho; 10.05.2010
comment
Верно, некоторые польские символы не возвращаются ToLower (). - person Chris Ballance; 30.08.2013
comment
@ChrisBallance & TomTom Не могли бы вы привести пример, в котором сбой в оба конца приводит к нежелательному поведению? - person Ohad Schneider; 05.07.2014
comment
Замечания типа «Я предлагаю сначала поискать в Google» так раздражают и бесполезны. Это 1-й результат в Google. - person Bartosz; 05.11.2019
comment
Я погуглил и получил первый результат - person Arina; 06.02.2020

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

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

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

person Henri    schedule 10.05.2010
comment
+1 правда. Я действительно читал об этом несколько дней назад и был очень удивлен, что есть разница. Однако я думаю, что разница должна быть довольно небольшой. - person gehho; 10.05.2010
comment
Есть ссылки на это? 10 лет занимаюсь .NET и считаюсь очень хорошим - я этого не знал;) Хотелось бы получить некоторую ссылку. - person TomTom; 10.05.2010
comment
Думаю, я видел это в CLR через C # (Дж. Рихтер). Тем не менее, все же предпочитаю использовать явный StringComparer. - person Phil Gan; 10.05.2010
comment
Ссылка кажется мертвой. - person Soner Gönül; 11.06.2018