Sobes.tech
Middle

Come avviene il confronto delle stringhe in C#? Vengono confrontate le referenze degli oggetti stringa?

sobes.tech AI

Risposta dell'AI

Il confronto delle stringhe in C# può avvenire in diversi modi:

  1. Operatore ==: Per le stringhe letterali e se le stringhe hanno lo stesso contenuto, l'operatore == restituirà true. A differenza di altri tipi di riferimento, per le stringhe l'operatore == è sovraccaricato per confrontare il contenuto, non i riferimenti.
  2. Metodo Equals(): Questo metodo confronta anche il contenuto delle stringhe per impostazione predefinita. È raccomandato per un confronto esplicito del contenuto e può essere più affidabile, specialmente quando si confrontano con null. Sono disponibili sovraccarichi per considerare la sensibilità alle maiuscole/minuscole e alla cultura.
  3. Metodo String.Compare(): Metodo statico che confronta due stringhe e restituisce un valore intero che indica la relazione di ordine tra esse. Permette di specificare diversi parametri di confronto (sensibilità alle maiuscole/minuscole, cultura, ecc.).
  4. Metodo String.CompareOrdinal(): Confronta le stringhe byte per byte, senza considerare le caratteristiche culturali.
  5. Metodo String.CompareTo(): Metodo di istanza che confronta la stringa corrente con un'altra stringa o oggetto. È simile a String.Compare(), ma viene chiamato su un oggetto stringa.

I riferimenti agli oggetti stringa non vengono confrontati direttamente con l'operatore == o con il metodo Equals() (senza sovraccarico personalizzato) in un confronto di contenuto normale. Sebbene le stringhe siano tipi di riferimento, per comodità l'operatore == e il metodo Equals() sono appositamente sovraccaricati per confrontare esattamente il contenuto.

string str1 = "hello";
string str2 = "hello";
string str3 = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });

// Confronto del contenuto
Console.WriteLine(str1 == str2);           // true (confronta il contenuto)
Console.WriteLine(str1.Equals(str2));    // true (confronta il contenuto)
Console.WriteLine(str1 == str3);           // true (confronta il contenuto)
Console.WriteLine(str1.Equals(str3));    // true (confronta il contenuto)

// Confronto delle referenze (richiede conversione esplicita o uso di ReferenceEquals)
// In questo caso, str1 e str2 possono riferirsi allo stesso oggetto
// grazie all'interning delle stringhe. str3, probabilmente, sarà un oggetto separato.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // può essere true o false a seconda di JIT e CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // probabilmente false