Comparaciones de cadenas de C #: diferencia entre CurrentCultureIgnoreCase e InvariantCultureIgnoreCase

StackOverflow https://stackoverflow.com/questions/417954

  •  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?

¿Fue útil?

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é).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top