2010-05-10 16 views
50

ho la seguente riga di codice:Cosa c'è di sbagliato in ToLowerInvariant()?

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

VS 2010 analisi del codice mi sta dicendo il seguente:

Attenzione 7 CA1308: Microsoft.Globalization: Nel metodo ... sostituire la chiamata a 'string.ToLowerInvariant()' con String.ToUpperInvariant().

Questo significa che ToUpperInvariant() è più affidabile?

+28

Si noti, tuttavia, che l'uso di 'string.Equals (item.Name, "ConnectionString", StringComparison.OrdinalIgnoreCase)' è probabilmente la soluzione migliore in questo caso particolare. –

+0

http://stackoverflow.com/questions/773703/normalization-of-strings-with-string-toupperinvariant – kenny

risposta

86

Google dà un suggerimento che punta al CA1308: Normalize strings to uppercase

Dice:

stringhe devono essere normalizzati in maiuscolo. Un piccolo gruppo di caratteri, quando vengono convertiti in lettere minuscole, non può effettuare un round trip. Fare un round trip significa convertire i caratteri da una locale ad un'altra locale che rappresenta i dati dei personaggi in modo diverso, e quindi recuperare in modo accurato i caratteri originali dai caratteri convertiti.

Quindi, sì - ToUpper è più affidabile di ToLower.

In futuro vi suggerisco di googling prima - lo faccio per tutti quegli avvertimenti FxCop vengo gettato intorno;) aiuta molto a leggere la relativa documentazione;)

+10

+1 per "Aiuta molto a leggere la documentazione corrispondente" (e anche per essere assolutamente corretto ...) – gehho

+0

Corretto, alcuni personaggi polacchi non effettuano il round-trip di ToLower(). –

+36

Googling mi ha portato a questa domanda. – richardtallent

19

Oltre a ciò che dice TomTom, .net è ottimizzato per confronto delle stringhe in maiuscolo. Quindi usare l'invariante superiore è teoricamente più veloce di lowerinvariant.

Questo è effettivamente indicato in CLR tramite C# come indicato nei commenti. Il seguente link riporta quella parte del libro. Non sono sicuro che questo sia vero, perché non c'è nulla da trovare su MSDN su questo argomento. La guida al confronto delle stringhe su msdn indica che toupperinvariant e tolowerinvariant sono uguali e non preferiscono il primo.

String comparisons in C#

+0

+1 vero. Ne ho letto alcuni giorni fa e sono rimasto piuttosto sorpreso dal fatto che ci sia una differenza. Tuttavia, penso che la differenza dovrebbe essere piuttosto piccola. – gehho

+0

Qualsiasi riferimento a questo? Fare .NET per 10 anni ed essere molto buono - non lo sapevo;) Mi piacerebbe avere qualche riferimento. – TomTom

+2

Penso di averlo visto in CLR tramite C# (J Richter). Comunque preferisco comunque usare un StringComparer esplicito. –

Problemi correlati