¿Cuál es la diferencia y cuándo usar qué? ¿Cuál es el riesgo si siempre uso ToLower()
y cuál es el riesgo si siempre uso ToLowerInvariant()
?
¿Cuál es la diferencia y cuándo usar qué? ¿Cuál es el riesgo si siempre uso ToLower()
y cuál es el riesgo si siempre uso ToLowerInvariant()
?
Respuestas:
Dependiendo de la cultura actual, ToLower podría producir una letra minúscula específica de la cultura, que no está esperando. Como producir ınfo
sin el punto en la i en lugar deinfo
y, por lo tanto, acumular comparaciones de cadenas. Por esa razón, ToLowerInvariant debe usarse en cualquier dato no específico del idioma. Cuando podría tener una entrada del usuario que podría estar en su idioma nativo / juego de caracteres, generalmente sería la única vez que use ToLower.
Consulte esta pregunta para ver un ejemplo de este problema: C # - ToLower () a veces elimina el punto de la letra "I"
Creo que esto puede ser útil:
http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx
actualizar
Si su aplicación depende del caso de una cadena que cambia de una manera predecible que no se ve afectada por la cultura actual, use el método ToLowerInvariant. El método ToLowerInvariant es equivalente a ToLower (CultureInfo.InvariantCulture). El método se recomienda cuando una colección de cadenas debe aparecer en un orden predecible en un control de interfaz de usuario.
además
... ToLower es muy similar en la mayoría de los lugares a ToLowerInvariant. Los documentos indican que estos métodos solo cambiarán el comportamiento con las culturas turcas. Además, en los sistemas Windows, el sistema de archivos no distingue entre mayúsculas y minúsculas, lo que limita aún más su uso ...
http://www.dotnetperls.com/tolowerinvariant-toupperinvariant
hth
String.ToLower()
usa la cultura predeterminada mientras String.ToLowerInvariant()
usa la cultura invariante. Por lo tanto, esencialmente pregunta las diferencias entre la cultura invariante y la comparación de cadenas ordinales .
ToLower
variantes; Ordinal vs. invariante simplemente cambia el "orden de clasificación" de dos cadenas, no cambia la comparación de igualdad.
TL; DR:
Cuando trabaje con "contenido" (por ejemplo, artículos, publicaciones, comentarios, nombres, lugares, etc.) use ToLower()
. Cuando trabaje con "literales" (por ejemplo, argumentos de línea de comando, gramáticas personalizadas, cadenas que deberían ser enumeraciones, etc.) use ToLowerInvariant()
.
Ejemplos:
= Uso ToLowerInvariant
incorrecto =
En turco, DIŞ
significa "afuera" y diş
significa "diente". La carcasa inferior adecuada de DIŞ
es dış
. Entonces, si usa ToLowerInvariant
incorrectamente, puede tener errores tipográficos en Turquía.
= Uso ToLower
incorrecto =
Ahora imagina que estás escribiendo un analizador SQL. En algún lugar tendrá un código similar al siguiente:
if(operator.ToLower() == "like")
{
// Handle an SQL LIKE operator
}
La gramática SQL no cambia cuando cambia de cultura. Un francés no escribe en SÉLECTIONNEZ x DE books
lugar de SELECT X FROM books
. Sin embargo, para que el código anterior funcione, una persona turca necesitaría escribir SELECT x FROM books WHERE Author LİKE '%Adams%'
(tenga en cuenta el punto sobre la capital i, casi imposible de ver). Esto sería bastante frustrante para su usuario turco.