2010-05-10 11 views
50

tengo la siguiente línea de código:¿Qué hay de malo con ToLowerInvariant()?

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

VS 2010 de análisis de código me está diciendo lo siguiente:

Advertencia 7 CA1308: Microsoft.Globalization: En el método ... reemplazar la llamada a 'string.ToLowerInvariant()' con String.ToUpperInvariant().

¿Hace esto que significa ToUpperInvariant() es más confiable?

+28

Tenga en cuenta, sin embargo, que el uso de 'string.Equals (item.Name, "connectionstring", StringComparison.OrdinalIgnoreCase)' es probablemente el mejor enfoque en este caso particular. –

+0

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

Respuesta

86

Google da una pista que apunta a CA1308: Normalize strings to uppercase

Dice:

Las cadenas tienen que ser normalizados a mayúsculas. Un pequeño grupo de caracteres, cuando se convierten a minúsculas, no puede hacer un viaje redondo. Hacer un viaje de ida y vuelta significa convertir los caracteres de una configuración regional a otra configuración regional que representa datos de caracteres de manera diferente, y luego recuperar con precisión los caracteres originales de los caracteres convertidos.

Así que, sí - ToUpper es más confiable que ToLower.

En el futuro Sugiero googlear primero - yo que para todas aquellas advertencias FxCop que son arrojados alrededor;) ayuda mucho a leer la documentación correspondiente;)

+10

+1 para "Ayuda mucho a leer la documentación correspondiente" (y también para ser absolutamente correcto ...) – gehho

+0

Correcto, algunos caracteres polacos no hacen que el ToLower() viaje de ida y vuelta. –

+36

Google me llevó a esta pregunta. – richardtallent

19

Además de lo que dice TomTom, .net está optimizado para comparación de cadenas en mayúsculas Entonces, usar invariante superior es teóricamente más rápido que una variante inferior.

Esto está de hecho declarado en CLR a través de C# como se señala en los comentarios. El siguiente enlace cita esa parte del libro. No estoy seguro de si esto es, por supuesto, muy cierto, ya que no se encuentra nada en MSDN sobre este tema. La guía de comparación de cadenas en msdn menciona que toupperinvariant y tolowerinvariant son iguales y no prefieren el primero.

String comparisons in C#

+0

+1 cierto. De hecho, leí sobre eso hace algunos días y me sorprendió bastante que haya una diferencia. Sin embargo, creo que la diferencia debería ser bastante pequeña. – gehho

+0

¿Alguna referencia a eso? Haciendo .NET 10 años y considerándolo muy bien, no lo sabía;) Me encantaría tener alguna referencia. – TomTom

+2

Creo que vi eso en CLR a través de C# (J Richter). Aún así, prefiero usar un StringComparer explícito. –

Cuestiones relacionadas