Sobes.tech
Middle

Hoe worden strings vergeleken in C#? Worden de referenties van string-objecten vergeleken?

sobes.tech AI

Antwoord van AI

Vergelijking van strings in C# kan op verschillende manieren worden gedaan:

  1. Operator ==: Voor string-literals en als de strings dezelfde inhoud hebben, geeft de operator == true terug. In tegenstelling tot andere referentietypen is de == operator voor strings overschreven om de inhoud te vergelijken, niet de referenties.
  2. Methode Equals(): Deze methode vergelijkt ook standaard de inhoud van de strings. Het wordt aanbevolen voor expliciete inhoudsvergelijkingen en kan betrouwbaarder zijn, vooral bij vergelijking met null. Er zijn overloads die rekening houden met hoofdlettergevoeligheid en cultuur.
  3. Methode String.Compare(): Een statische methode die twee strings vergelijkt en een geheel getal retourneert dat de relatie tussen hen aangeeft. Hiermee kunnen verschillende vergelijkingsparameters worden gespecificeerd (hoofdlettergevoeligheid, cultuur, enz.).
  4. Methode String.CompareOrdinal(): Vergelijkt de strings byte voor byte, zonder rekening te houden met culturele kenmerken.
  5. Methode String.CompareTo(): Een instantie-methode die de huidige string vergelijkt met een andere string of object. Het lijkt op String.Compare(), maar wordt aangeroepen op een string-object.

De referenties van string-objecten worden niet direct vergeleken met de operator == of de methode Equals() (zonder aangepaste overload) bij een normale inhoudsvergelijking. Hoewel strings referentietypen zijn, zijn == en Equals() speciaal overschreven om precies de inhoud te vergelijken.

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

// Inhoudsvergelijking
Console.WriteLine(str1 == str2);           // true (vergelijking van inhoud)
Console.WriteLine(str1.Equals(str2));    // true (vergelijking van inhoud)
Console.WriteLine(str1 == str3);           // true (vergelijking van inhoud)
Console.WriteLine(str1.Equals(str3));    // true (vergelijking van inhoud)

// Referentievergelijking (vereist expliciete conversie of gebruik van ReferenceEquals)
// In dit geval kunnen str1 en str2 naar hetzelfde object verwijzen
// dankzij string interning. str3 zal waarschijnlijk een apart object zijn.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // kan true of false zijn afhankelijk van JIT en CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // waarschijnlijk false