Sobes.tech
Middle

Comment la comparaison des chaînes se fait-elle en C# ? Les références des objets chaîne sont-elles comparées ?

sobes.tech IA

Réponse de l'IA

La comparaison des chaînes en C# peut se faire de plusieurs manières :

  1. Opérateur == : Pour les littéraux de chaînes et si les chaînes ont le même contenu, l'opérateur == renverra true. Contrairement à d'autres types de référence, pour les chaînes, l'opérateur == est surchargé pour comparer le contenu, pas les références.
  2. Méthode Equals() : Cette méthode compare également le contenu des chaînes par défaut. Elle est recommandée pour une comparaison explicite du contenu et peut être plus fiable, notamment lors de la comparaison avec null. Il existe des surcharges pour prendre en compte la sensibilité à la casse et la culture.
  3. Méthode String.Compare() : Méthode statique qui compare deux chaînes et retourne une valeur entière indiquant la relation d'ordre entre elles. Permet de spécifier différents paramètres de comparaison (sensibilité à la casse, culture, etc.).
  4. Méthode String.CompareOrdinal() : Compare les chaînes octet par octet, sans tenir compte des particularités culturelles.
  5. Méthode String.CompareTo() : Méthode d'instance qui compare la chaîne courante avec une autre chaîne ou un objet. Elle est similaire à String.Compare(), mais s'appelle sur un objet chaîne.

Les références d'objets chaîne ne sont pas comparées directement avec l'opérateur == ou la méthode Equals() (sans surcharge personnalisée) lors d'une comparaison de contenu normale. Bien que les chaînes soient des types de référence, pour faciliter leur utilisation, l'opérateur == et la méthode Equals() sont spécialement surchargés pour comparer précisément le contenu.

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

// Comparaison de contenu
Console.WriteLine(str1 == str2);           // true (comparaison du contenu)
Console.WriteLine(str1.Equals(str2));    // true (comparaison du contenu)
Console.WriteLine(str1 == str3);           // true (comparaison du contenu)
Console.WriteLine(str1.Equals(str3));    // true (comparaison du contenu)

// Comparaison de références (nécessite une conversion explicite ou l'utilisation de ReferenceEquals)
// Dans ce cas, str1 et str2 peuvent référencer le même objet
// en raison de l'internement des chaînes. str3 sera probablement un objet séparé.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // peut être true ou false selon le JIT et le CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // probablement false