Sobes.tech
Middle

Πώς γίνεται η σύγκριση συμβολοσειρών σε C#; Συγκρίνονται οι αναφορές των αντικειμένων συμβολοσειρών;

sobes.tech AI

Απάντηση από AI

Η σύγκριση συμβολοσειρών σε C# μπορεί να πραγματοποιηθεί με διάφορους τρόπους:

  1. Τελεστής ==: Για τις κυριολεκτικές συμβολοσειρές και αν οι συμβολοσειρές έχουν το ίδιο περιεχόμενο, ο τελεστής == θα επιστρέψει true. Σε αντίθεση με άλλους τύπους αναφοράς, για τις συμβολοσειρές, ο τελεστής == είναι υπερφορτωμένος για να συγκρίνει το περιεχόμενο, όχι τις αναφορές.
  2. Μέθοδος Equals(): Αυτή η μέθοδος συγκρίνει επίσης το περιεχόμενο των συμβολοσειρών από προεπιλογή. Συνιστάται για ρητή σύγκριση περιεχομένου και μπορεί να είναι πιο αξιόπιστη, ειδικά κατά τη σύγκριση με null. Υπάρχουν υπερφορτώσεις που λαμβάνουν υπόψη την ευαισθησία σε πεζά/κεφαλαία και τον πολιτισμό.
  3. Μέθοδος String.Compare(): Μια στατική μέθοδος που συγκρίνει δύο συμβολοσειρές και επιστρέφει μια ακέραια τιμή που δείχνει τη σχέση ταξινόμησης μεταξύ τους. Επιτρέπει τον ορισμό διαφόρων παραμέτρων σύγκρισης (ευαισθησία σε πεζά/κεφαλαία, πολιτισμό κ.λπ.).
  4. Μέθοδος String.CompareOrdinal(): Συγκρίνει τις συμβολοσειρές byte με byte, χωρίς να λαμβάνει υπόψη τα πολιτισμικά χαρακτηριστικά.
  5. Μέθοδος String.CompareTo(): Μια μέθοδος στιγμιότυπου που συγκρίνει την τρέχουσα συμβολοσειρά με μια άλλη συμβολοσειρά ή αντικείμενο. Είναι παρόμοια με το String.Compare(), αλλά καλείται σε ένα αντικείμενο συμβολοσειράς.

Οι αναφορές αντικειμένων συμβολοσειράς δεν συγκρίνονται άμεσα με τον τελεστή == ή τη μέθοδο Equals() (χωρίς προσαρμοσμένη υπερφόρτωση) σε μια κανονική σύγκριση περιεχομένου. Αν και οι συμβολοσειρές είναι τύποι αναφοράς, ο == και η Equals() είναι ειδικά υπερφορτωμένοι για να συγκρίνουν ακριβώς το περιεχόμενο.

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

// Σύγκριση περιεχομένου
Console.WriteLine(str1 == str2);           // true (συγκρίνεται το περιεχόμενο)
Console.WriteLine(str1.Equals(str2));    // true (συγκρίνεται το περιεχόμενο)
Console.WriteLine(str1 == str3);           // true (συγκρίνεται το περιεχόμενο)
Console.WriteLine(str1.Equals(str3));    // true (συγκρίνεται το περιεχόμενο)

// Σύγκριση αναφορών (απαιτείται ρητή μετατροπή ή χρήση του ReferenceEquals)
// Σε αυτήν την περίπτωση, τα str1 και str2 μπορεί να αναφέρονται στο ίδιο αντικείμενο
// λόγω του intern των συμβολοσειρών. Το str3, πιθανότατα, θα είναι ένα ξεχωριστό αντικείμενο.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // μπορεί να είναι true ή false ανάλογα με το JIT και το CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // πιθανότατα false