Sobes.tech
Middle

Cum se compară șirurile în C#? Se compară referințele obiectelor de șir?

sobes.tech AI

Răspuns de la AI

Compararea șirurilor în C# poate avea loc în mai multe moduri:

  1. Operatorul ==: Pentru literale de șiruri și dacă șirurile au conținutul identic, operatorul == va returna true. Spre deosebire de alte tipuri de referință, pentru șiruri, operatorul == este suprascris pentru a compara conținutul, nu referințele.
  2. Metoda Equals(): Această metodă compară, de asemenea, conținutul șirurilor în mod implicit. Este recomandată pentru o comparație explicită a conținutului și poate fi mai fiabilă, mai ales la compararea cu null. Există suprasarcini pentru a ține cont de sensibilitatea la majuscule/minuscule și cultură.
  3. Metoda String.Compare(): O metodă statică care compară două șiruri și returnează o valoare întreagă care indică relația de ordine între ele. Permite specificarea diferiților parametri de comparație (sensibilitate la majuscule/minuscule, cultură etc.).
  4. Metoda String.CompareOrdinal(): Compară șirurile byte cu byte, fără a ține cont de particularitățile culturale.
  5. Metoda String.CompareTo(): O metodă de instanță care compară șirul curent cu alt șir sau obiect. Este similară cu String.Compare(), dar se apelează pe un obiect de tip șir.

Referințele obiectelor de tip șir nu sunt comparate direct cu operatorul == sau metoda Equals() (fără suprasarcină personalizată) în cazul unei comparații normale de conținut. Deși șirurile sunt tipuri de referință, operatorul == și metoda Equals() sunt special suprascrise pentru a compara exact conținutul.

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

// Compararea conținutului
Console.WriteLine(str1 == str2);           // true (se compară conținutul)
Console.WriteLine(str1.Equals(str2));    // true (se compară conținutul)
Console.WriteLine(str1 == str3);           // true (se compară conținutul)
Console.WriteLine(str1.Equals(str3));    // true (se compară conținutul)

// Compararea referințelor (necesită conversie explicită sau utilizarea ReferenceEquals)
// În acest caz, str1 și str2 pot referi același obiect
// datorită internării șirurilor. str3, cel mai probabil, va fi un obiect separat.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // poate fi true sau false, în funcție de JIT și CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // cel mai probabil false