Какво не е наред с ToLowerInvariant()?

Имам следния ред код:

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

Анализът на кода на VS 2010 ми казва следното:

Предупреждение 7 CA1308 : Microsoft.Globalization : В метод ... заменете извикването на '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
comment
stackoverflow.com/questions/773703/   -  person kenny    schedule 02.12.2012


Отговори (2)


Google дава намек, сочещ към CA1308: Нормализиране на низовете до главни букви

Казва:

Низовете трябва да се нормализират до главни букви. Малка група знаци, когато се преобразуват в малки букви, не могат да направят двупосочно пътуване. Да се ​​направи двупосочно означава да се преобразуват знаците от един локал в друг локал, който представя символните данни по различен начин, и след това точно да се извлекат оригиналните знаци от преобразуваните знаци.

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

В бъдеще предлагам първо да потърся в гугъл - правя го за всички онези предупреждения на 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“ са толкова досадни и безполезни. Това е първият резултат в Google. - person Bartosz; 05.11.2019
comment
Потърсих го в Google и се озовах тук с първия резултат - 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
Някаква препратка към това? Правя .NET 10 години и се смятам за q за много добър - не знаех това;) Бих искал да имам някаква справка. - person TomTom; 10.05.2010
comment
Мисля, че видях това в CLR чрез C# (J Richter). Все пак предпочитате да използвате изричен StringComparer. - person Phil Gan; 10.05.2010
comment
Връзката изглежда мъртва. - person Soner Gönül; 11.06.2018