Sobes.tech
Middle

Hogyan történik a sztringek összehasonlítása C#-ban? Összehasonlítják a sztring objektumok hivatkozásait?

sobes.tech MI

Válasz az MI-től

A C#-ban a szövegek összehasonlítása többféleképpen is történhet:

  1. == operátor: Szöveg literálok esetén, és ha a szövegek tartalma megegyezik, az == operátor true értéket ad vissza. Más referencia típusokkal ellentétben, a szövegeknél az == operátor felül van töltve, hogy a tartalmat hasonlítsa össze, nem a referenciákat.
  2. Equals() metódus: Ez a metódus szintén alapértelmezés szerint a szövegek tartalmát hasonlítja össze. Ajánlott a tartalom explicit összehasonlítására, és megbízhatóbb lehet, különösen null-lal való összehasonlításnál. Vannak túlterhelések, amelyek figyelembe veszik a kis- és nagybetűket, valamint a kultúrát.
  3. String.Compare() metódus: Egy statikus metódus, amely két szöveget összehasonlít, és egy egész számot ad vissza, ami a sorrendiség viszonyát mutatja közöttük. Különböző összehasonlítási paramétereket lehet megadni (kis/nagybetű érzékenység, kultúra stb.).
  4. String.CompareOrdinal() metódus: Byte-by-byte összehasonlítja a szövegeket, figyelmen kívül hagyva a kulturális sajátosságokat.
  5. String.CompareTo() metódus: Egy példány metódus, amely összehasonlítja az aktuális szöveget egy másik szöveggel vagy objektummal. Hasonló a String.Compare()-hez, de az objektumon hívják meg.

A szövegobjektumok referenciái nem kerülnek közvetlenül összehasonlításra az == operátorral vagy a Equals() metódussal (felhasználói túlterhelés nélkül) normál tartalom összehasonlítás esetén. Bár a szövegek referencia típusok, az == és az Equals() kifejezetten felül vannak töltve, hogy pontosan a tartalmat hasonlítsák össze.

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

// Tartalom összehasonlítása
Console.WriteLine(str1 == str2);           // true (tartalom összehasonlítva)
Console.WriteLine(str1.Equals(str2));    // true (tartalom összehasonlítva)
Console.WriteLine(str1 == str3);           // true (tartalom összehasonlítva)
Console.WriteLine(str1.Equals(str3));    // true (tartalom összehasonlítva)

// Referencia összehasonlítás (kifejezett típuskonverzió vagy ReferenceEquals szükséges)
// Ebben az esetben, a str1 és str2 ugyanarra az objektumra mutathatnak
// a sztringek internálásának köszönhetően. A str3 valószínűleg külön objektum lesz.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // lehet, hogy true vagy false, a JIT és a CLR függvényében
Console.WriteLine(object.ReferenceEquals(str1, str3)); // valószínűleg false