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:
- Operatorul
==: Pentru literale de șiruri și dacă șirurile au conținutul identic, operatorul==va returnatrue. Spre deosebire de alte tipuri de referință, pentru șiruri, operatorul==este suprascris pentru a compara conținutul, nu referințele. - 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 cunull. Există suprasarcini pentru a ține cont de sensibilitatea la majuscule/minuscule și cultură. - 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.). - Metoda
String.CompareOrdinal(): Compară șirurile byte cu byte, fără a ține cont de particularitățile culturale. - Metoda
String.CompareTo(): O metodă de instanță care compară șirul curent cu alt șir sau obiect. Este similară cuString.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