Що не так із ToLowerInvariant ()?


77

У мене є такий рядок коду:

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

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

Попередження 7 CA1308: Microsoft.Globalization: У методі ... замініть виклик 'string.ToLowerInvariant ()' на String.ToUpperInvariant ().

Чи означає ToUpperInvariant()це більш надійним?


33
Однак зауважте, що використання string.Equals(item.Name, "connectionstring", StringComparison.OrdinalIgnoreCase), мабуть, найкращий підхід у цьому конкретному випадку.
Greg Beech

Відповіді:


114

Google дає підказку, вказуючи на CA1308: Нормалізувати рядки до великих літер

Він говорить:

Рядки слід нормалізувати до великих літер. Невелика група символів, коли вони перетворюються на малу літеру, не можуть здійснити зворотний шлях. Здійснити перебіг в обидва кінці означає перетворити символи з однієї мови на іншу мову, яка по-різному представляє дані символів, а потім точно отримати вихідні символи з перетворених символів.

Отже, так - ToUpper надійніший за ToLower.

Надалі я пропоную спочатку погуглити - я роблю це для всіх тих попереджень FxCop, які мені кидають;) Дуже допомагає прочитати відповідну документацію;)


13
+1 за "Дуже допомагає прочитати відповідну документацію" (а також за те, що я абсолютно коректний ...)
gehho

Правильно, деякі польські символи не здійснюють туди-назад поїздку ToLower ().
Chris Ballance

14
@ChrisBallance & TomTom Не могли б ви навести приклад, коли відмова в обидва кінці призводить до небажаної поведінки?
Охад Шнайдер

28
Зауваження "Я пропоную спочатку погугліти" настільки дратують і марні. Це перший результат Google.
Bartosz

7
Я погуглив, і опинився тут з першим результатом
Аріна

23

Крім того, що говорить TomTom, .net оптимізовано для порівняння рядків у верхньому регістрі. Отже, використання верхнього інваріанта теоретично швидше, ніж нижнього інваріанта.

Це справді зазначено в CLR через C #, як зазначено в коментарях. Наступне посилання цитує цю частину книги. Я не впевнений, що це, звичайно, справді так, оскільки на MSDN про цю тему нічого не можна знайти. У посібнику для порівняння рядків на msdn згадується, що toupperinvariant і tolowerinvariant рівні і не надає переваги першому.

Порівняння рядків у C #


+1 правда. Я насправді читав про це кілька днів тому і був дуже здивований, що є різниця. Однак, я думаю, що різниця має бути досить невеликою.
gehho

Будь-яке посилання на це? Робити .NET 10 років і вважати мене дуже гарним - я цього не знав;) Хотілося б отримати посилання.
TomTom

2
Здається, я це бачив у CLR через C # (J Richter). Все ж воліють використовувати явний StringComparer.
Філ Ган

1
Посилання здається мертвим.
Soner Gönül
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.