Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Tip
Questo articolo fa parte della sezione Nozioni fondamentali per gli sviluppatori che già conoscono almeno un linguaggio di programmazione e stanno imparando C#. Se non si ha familiarità con la programmazione, iniziare prima con le esercitazioni introduttive .
Venire da un'altra lingua? C# == sulle stringhe confronta i valori, non i riferimenti, in modo molto simile a equals di Java o a === di JavaScript. La differenza principale è che C# consente di scegliere tra il confronto ordinale (binario) e il confronto con distinzione delle impostazioni cultura tramite il valore StringComparison.
Le stringhe vengono confrontate per rispondere a una di due domande: le due stringhe sono uguali? o In quale ordine vengono ordinate queste stringhe? C# consente di controllare due fattori indipendenti quando si risponde a una delle due domande:
-
Sensibilità alle maiuscole/minuscole — se
"Hello"e"hello"sono considerati uguali. - Tipo di confronto — ordinale (confrontare il valore binario di ogni carattere) o sensibile alle impostazioni cultura (applicare le regole linguistiche di una cultura).
L'enumerazione StringComparison combina questi fattori in un singolo valore passato ai metodi di confronto.
Confrontare per verificarne l'uguaglianza
Il String.Equals metodo e l'operatore == eseguono entrambi un confronto ordinale con distinzione tra maiuscole e minuscole per impostazione predefinita. Il confronto ordinale controlla il valore binario di ogni carattere, quindi è veloce e restituisce lo stesso risultato in ogni computer. È possibile esplicitare la propria intenzione richiamando l'overload che accetta un valore StringComparison:
string root = @"C:\users";
string root2 = @"C:\Users";
// Equals and == both perform a case-sensitive, ordinal comparison.
Console.WriteLine(root.Equals(root2));
// => False
Console.WriteLine(root == root2);
// => False
// Pass a StringComparison value to state the intent explicitly.
Console.WriteLine(root.Equals(root2, StringComparison.Ordinal));
// => False
Per ignorare la distinzione tra maiuscole e minuscole mantenendo la semantica ordinale, passare StringComparison.OrdinalIgnoreCase:
string root = @"C:\users";
string root2 = @"C:\Users";
// OrdinalIgnoreCase compares the binary values but ignores case.
bool equalIgnoringCase = string.Equals(root, root2, StringComparison.OrdinalIgnoreCase);
Console.WriteLine(equalIgnoringCase);
// => True
Confrontare per l'ordinamento
Per determinare l'ordinamento anziché l'uguaglianza, usare String.Compare. Restituisce un numero negativo, zero o un numero positivo per indicare se la prima stringa viene ordinata prima, nella stessa posizione o dopo la seconda:
string first = "Avocado";
string second = "Banana";
// Compare returns a negative number, zero, or a positive number
// to indicate sort order. Specify the comparison type explicitly.
int order = string.Compare(first, second, StringComparison.Ordinal);
Console.WriteLine(order < 0
? $"'{first}' sorts before '{second}'."
: $"'{first}' sorts at or after '{second}'.");
// => 'Avocado' sorts before 'Banana'.
Importante
Compare e CompareTo usano per impostazione predefinita un confronto dipendente dalle impostazioni cultura, mentre Equals e == usano per impostazione predefinita un confronto ordinale. Per evitare sorprese, passare un valore esplicito StringComparison in modo che il codice indichi il comportamento desiderato.
Confrontare con costanti tramite corrispondenza di pattern is o switch
Quando il valore confrontato con è una costante, è possibile usare l'operatoreis con un criterio costante come alternativa leggibile a ==:
string status = "Ready";
// When the right operand is a constant, the is operator and a
// constant pattern read as an alternative to ==.
if (status is "Ready")
{
Console.WriteLine("The system is ready.");
}
// => The system is ready.
Per confrontare una stringa con diverse costanti, usare un'espressioneswitch. Ogni braccio verifica un pattern costante e il pattern discard (_) gestisce ogni valore che non corrisponde. L'esempio seguente associa una parola chiave di direzione a un'istruzione di navigazione:
foreach (string heading in new[] { "North", "South", "East", "West", "NE" })
{
// A switch expression matches each constant pattern in turn and
// returns the first match. The discard (_) handles every other value.
string instruction = heading switch
{
"North" => "Travel due North for 10 km.",
"South" => "Travel due South for 10 km.",
"East" => "Travel due East for 10 km.",
"West" => "Travel due West for 10 km.",
_ => $"Unknown heading: {heading}.",
};
Console.WriteLine(instruction);
}
// => Travel due North for 10 km.
// => Travel due South for 10 km.
// => Travel due East for 10 km.
// => Travel due West for 10 km.
// => Unknown heading: NE.
Un'espressione switch che verifica le costanti stringa esegue lo stesso confronto ordinale con distinzione tra maiuscole e minuscole di ==, quindi "north" non corrisponde al ramo "North".
Scegliere il confronto corretto
Selezionare il tipo di confronto in base ai dati, non per abitudine:
- Per identificatori, percorsi di file, token di protocollo e altro testo definito dal computer, usare Ordinal (o OrdinalIgnoreCase per ignorare la distinzione tra maiuscole e minuscole). Il confronto ordinale è rapido e uniforme tra le diverse impostazioni cultura.
- Per il testo letto e ordinato dagli utenti, ad esempio nomi o titoli di prodotto, usare CurrentCulture in modo che l'ordine corrisponda alle aspettative dell'utente.
Il confronto con riconoscimento delle impostazioni cultura applica regole linguistiche che variano in base alla cultura e può produrre risultati sorprendenti. Ad esempio, alcune culture considerano "ss" e "ß" uguali e l'ordine delle stringhe può cambiare da un computer all'altro. A causa di tale variabilità, riservare un confronto compatibile con le impostazioni cultura per il testo originale in linguaggio naturale e usare lo stesso tipo di confronto ogni volta che si ordina e si cerca una raccolta.
Per una trattazione approfondita del confronto dipendente dalle impostazioni cultura, incluse le considerazioni sulla globalizzazione e le differenze tra piattaforme, vedi Procedure consigliate per confrontare le stringhe in .NET.