Confronti di stringhe C #: differenza tra CurrentCultureIgnoreCase e InvariantCultureIgnoreCase
-
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?
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.)