Confronti di stringhe C #: differenza tra CurrentCultureIgnoreCase e InvariantCultureIgnoreCase

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

  •  03-07-2019
  •  | 
  •  

Domanda

Quando si fa un confronto di stringhe in C #, qual è la differenza tra fare un

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);

e

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);

... ed è importante includere quel parametro extra, comunque?

È stato utile?

Soluzione

Microsoft fornisce alcune indicazioni decenti su quando utilizzare la proprietà InvariantCulture :

MSDN: Proprietà CultureInfo.InvariantCulture

  

... un'applicazione dovrebbe usare il   cultura invariante solo per processi   che richiedono cultura indipendente   risultati, come la formattazione e   analisi dei dati persistenti in a   file. In altri casi, produce   risultati che potrebbero essere linguisticamente   errato o culturalmente inappropriato.

     

Considerazioni sulla sicurezza

     

Se verrà presa una decisione di sicurezza   basato sul risultato di una stringa   confronto o cambio di caso, il tuo   l'applicazione dovrebbe usare un ordinale   confronto che ignora invece il caso   di usare InvariantCulture. [...]

     

Operazioni sulle stringhe

     

Se l'applicazione deve eseguire a   operazione di stringa sensibile alla cultura   che non è influenzato dal valore di   CurrentCulture, dovrebbe usare un metodo   che accetta un parametro CultureInfo.   [...]

     

Dati persistenti

     

La proprietà InvariantCulture è   utile per la memorizzazione di dati che non lo faranno   essere visualizzato direttamente agli utenti.   Archiviazione dei dati in una cultura indipendente   format garantisce un formato noto che   non cambia. Quando gli utenti da   culture diverse accedono ai dati   può essere formattato in modo appropriato   su un utente specifico. [...]

Altri suggerimenti

Gli altri post hanno dato buoni consigli, ma ho pensato che sarebbe stato bello mostrare un esempio di dove sicuramente fa la differenza:

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));
    }
}

(Non ci sono molti altri casi, questo è stato solo il primo a cui ho pensato.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top