Comparaciones de cadenas de C #: diferencia entre CurrentCultureIgnoreCase e InvariantCultureIgnoreCase
-
03-07-2019 - |
Pregunta
Al hacer una comparación de cadenas en C #, ¿cuál es la diferencia entre hacer una
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);
y
string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);
... y es importante incluir ese parámetro extra, de todos modos?
Solución
Microsoft brinda una guía decente sobre cuándo usar la propiedad InvariantCulture
:
MSDN: CultureInfo.InvariantCulture Property
... una aplicación debe usar el Cultura invariante solo para procesos. que requieren cultura independiente resultados, tales como el formato y análisis de datos que se persisten a una expediente. En otros casos, produce. resultados que podrían ser lingüísticamente incorrecto o culturalmente inadecuado.
Consideraciones de seguridad
Si se tomará una decisión de seguridad basado en el resultado de una cadena comparación o cambio de caso, su la aplicación debe utilizar un ordinal comparación que ignora el caso en su lugar de utilizar InvariantCulture. [...]
Operaciones con cadenas
Si su aplicación necesita realizar un operación de cuerda sensible a la cultura que no se ve afectado por el valor de CurrentCulture, debe utilizar un método. que acepta un parámetro CultureInfo. [...]
Datos persistentes
La propiedad InvariantCulture es Útil para almacenar datos que no Se mostrará directamente a los usuarios. Almacenamiento de datos en una cultura independiente. formato garantiza un formato conocido que no cambia. Cuando los usuarios de diferentes culturas acceden a los datos, Puede ser formateado apropiadamente basado en usuario específico. [...]
Otros consejos
Las otras publicaciones han dado buenos consejos, pero pensé que sería bueno mostrar un ejemplo de donde definitivamente hace una diferencia:
using System;
using System.Globalization;
using System.Threading;
class Test
{
static void Main()
{
CultureInfo turkish = CultureInfo.CreateSpecificCulture("tr");
Thread.CurrentThread.CurrentCulture = turkish;
// In Turkey, "i" does odd things
string lower = "i";
string upper = "I";
Console.WriteLine(lower.Equals(upper,
StringComparison.CurrentCultureIgnoreCase));
Console.WriteLine(lower.Equals(upper,
StringComparison.InvariantCultureIgnoreCase));
}
}
(No hay duda de que hay muchos otros casos, este fue solo el primero en el que pensé).