Sobes.tech
Middle

Wie erfolgt der Vergleich von Strings in C#? Werden die Referenzen der String-Objekte verglichen?

sobes.tech KI

Antwort von AI

Der Vergleich von Strings in C# kann auf verschiedene Weisen erfolgen:

  1. Operator ==: Für String-Literale und wenn die Strings den gleichen Inhalt haben, gibt der Operator == true zurück. Im Gegensatz zu anderen Referenztypen ist der Operator == für Strings überladen, um den Inhalt zu vergleichen, nicht die Referenzen.
  2. Methode Equals(): Diese Methode vergleicht ebenfalls standardmäßig den Inhalt der Strings. Sie wird für einen expliziten Inhaltsvergleich empfohlen und ist zuverlässiger, insbesondere bei Vergleichen mit null. Es gibt Überladungen, die die Groß-/Kleinschreibung und Kultur berücksichtigen.
  3. Methode String.Compare(): Eine statische Methode, die zwei Strings vergleicht und einen ganzzahligen Wert zurückgibt, der die Beziehung zwischen den Strings angibt. Sie erlaubt die Angabe verschiedener Vergleichsparameter (Groß-/Kleinschreibung, Kultur usw.).
  4. Methode String.CompareOrdinal(): Vergleicht die Strings Byte für Byte, ohne kulturelle Besonderheiten zu berücksichtigen.
  5. Methode String.CompareTo(): Eine Instanzmethode, die die aktuelle String mit einer anderen String oder einem Objekt vergleicht. Sie ist ähnlich wie String.Compare(), wird aber auf einem String-Objekt aufgerufen.

String-Objekt-Referenzen werden bei normalem Vergleich nicht direkt mit == oder Equals() (ohne benutzerdefinierte Überladung) verglichen. Obwohl Strings Referenztypen sind, sind == und Equals() speziell überladen, um den Inhalt genau zu vergleichen.

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

// Inhaltsvergleich
Console.WriteLine(str1 == str2);           // true (Inhalt wird verglichen)
Console.WriteLine(str1.Equals(str2));    // true (Inhalt wird verglichen)
Console.WriteLine(str1 == str3);           // true (Inhalt wird verglichen)
Console.WriteLine(str1.Equals(str3));    // true (Inhalt wird verglichen)

// Referenzvergleich (erfordert explizite Umwandlung oder Verwendung von ReferenceEquals)
// In diesem Fall können str1 und str2 auf dasselbe Objekt verweisen
// aufgrund des String-Internings. str3 ist wahrscheinlich ein separates Objekt.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // kann true oder false sein, abhängig von JIT und CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // wahrscheinlich false