Lire en anglais

Partager via


Comparaisons d’égalité (Guide de programmation C#)

Il est parfois nécessaire de comparer deux valeurs pour l’égalité. Dans certains cas, vous testez l’égalité des valeurs, également appelée équivalence, ce qui signifie que les valeurs contenues par les deux variables sont égales. Dans d’autres cas, vous devez déterminer si deux variables font référence au même objet sous-jacent en mémoire. Ce type d’égalité est appelé égalité de référence ou identité. Cette rubrique décrit ces deux types d’égalité et fournit des liens vers d’autres rubriques pour plus d’informations.

Égalité des références

L’égalité des références signifie que deux références d’objet font référence au même objet sous-jacent. Cela peut se produire par le biais d’une affectation simple, comme illustré dans l’exemple suivant.

C#
using System;
class Test
{
    public int Num { get; set; }
    public string Str { get; set; }

    public static void Main()
    {
        Test a = new Test() { Num = 1, Str = "Hi" };
        Test b = new Test() { Num = 1, Str = "Hi" };

        bool areEqual = System.Object.ReferenceEquals(a, b);
        // False:
        System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");

        // Assign b to a.
        b = a;

        // Repeat calls with different results.
        areEqual = System.Object.ReferenceEquals(a, b);
        // True:
        System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");
    }
}

Dans ce code, deux objets sont créés, mais après l’instruction d’affectation, les deux références font référence au même objet. Ils ont donc une égalité de référence. Utilisez la ReferenceEquals méthode pour déterminer si deux références font référence au même objet.

Le concept d’égalité de référence s’applique uniquement aux types de référence. Les objets de type valeur ne peuvent pas avoir d’égalité de référence, car lorsqu’une instance d’un type valeur est affectée à une variable, une copie de la valeur est effectuée. Par conséquent, vous ne pouvez jamais avoir deux structures non encapsulées qui se réfèrent au même emplacement en mémoire. En outre, si vous utilisez ReferenceEquals pour comparer deux types valeur, le résultat sera toujours false, même si les valeurs contenues dans les objets sont toutes identiques. Cela est dû au fait que chaque variable est boxée dans une instance d’objet distincte. Pour plus d’informations, consultez Comment tester l’égalité des références (Identity).

Égalité des valeurs

L’égalité des valeurs signifie que deux objets contiennent la même valeur ou les mêmes valeurs. Pour les types de valeurs primitives tels que int ou bool, les tests d’égalité des valeurs sont simples. Vous pouvez utiliser l’opérateur == , comme illustré dans l’exemple suivant.

C#
int a = GetOriginalValue();  
int b = GetCurrentValue();  
  
// Test for value equality.
if (b == a)
{  
    // The two integers are equal.  
}  

Pour la plupart des autres types, le test de l’égalité des valeurs est plus complexe, car il vous faut comprendre comment le type le définit. Pour les classes et les structs qui ont plusieurs champs ou propriétés, l’égalité des valeurs est souvent définie pour signifier que tous les champs ou propriétés ont la même valeur. Par exemple, deux Point objets peuvent être définis comme équivalents si pointA.X est égal à pointB.X et pointA.Y est égal à pointB.Y. Pour les enregistrements, l’égalité des valeurs signifie que deux variables d’un type d’enregistrement sont égales si les types correspondent et que toutes les valeurs de propriété et de champ correspondent.

Toutefois, il n’est pas nécessaire que l’équivalence soit basée sur tous les champs d’un type. Elle peut être basée sur un sous-ensemble. Lorsque vous comparez les types que vous ne possédez pas, vous devez vous assurer de comprendre spécifiquement comment l’équivalence est définie pour ce type. Pour plus d’informations sur la définition de l’égalité des valeurs dans vos propres classes et structs, consultez Comment définir l’égalité des valeurs pour un type.

Égalité des valeurs pour les valeurs à virgule flottante

Les comparaisons d’égalité des valeurs à virgule flottante (double et float) sont problématiques en raison de l’imprécision de l’arithmétique à virgule flottante sur les ordinateurs binaires. Pour plus d’informations, consultez les remarques contenues dans la rubrique System.Double.

Titre Descriptif
Guide pratique pour tester l’égalité des références (Identité) Décrit comment déterminer si deux variables ont une égalité de référence.
Comment définir l’égalité des valeurs pour un type Décrit comment fournir une définition personnalisée de l’égalité des valeurs pour un type.
Types Fournit des informations sur le système de type C# et des liens vers des informations supplémentaires.
Dossiers Fournit des informations sur les types d’enregistrements, qui testent par défaut l’égalité des valeurs.

Ressources supplémentaires

Documentation