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

Il est parfois nécessaire de comparer l’égalité de deux valeurs.It is sometimes necessary to compare two values for equality. Dans certains cas, vous testez l’égalité de valeur, également appelée équivalence, qui signifie que les valeurs contenues dans les deux variables sont égales.In some cases, you are testing for value equality, also known as equivalence, which means that the values that are contained by the two variables are equal. Dans d’autres cas, vous devez déterminer si deux variables référencent le même objet sous-jacent en mémoire.In other cases, you have to determine whether two variables refer to the same underlying object in memory. Ce type d’égalité est appelée l’égalité de référence ou identité.This type of equality is called reference equality, or identity. Cette rubrique décrit ces deux genres d’égalité et fournit des liens vers d’autres rubriques pour obtenir plus d’informations.This topic describes these two kinds of equality and provides links to other topics for more information.

Égalité des référencesReference equality

L’égalité de références signifie que deux références d’objets référencent le même objet sous-jacent.Reference equality means that two object references refer to the same underlying object. Cela peut se produire par simple assignation, comme illustré dans l’exemple suivant.This can occur through simple assignment, as shown in the following example.

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

    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) = {0}", 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) = {0}", areEqual);

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}

Dans ce code, deux objets sont créés, mais après l’instruction d’assignation, les deux références référencent le même objet.In this code, two objects are created, but after the assignment statement, both references refer to the same object. Elles présentent donc une égalité de référence.Therefore they have reference equality. Utilisez la méthode ReferenceEquals pour déterminer si deux références référencent le même objet.Use the ReferenceEquals method to determine whether two references refer to the same object.

Le concept d’égalité de référence s’applique uniquement aux types référence.The concept of reference equality applies only to reference types. Les objets de type valeur ne peuvent pas avoir une égalité de référence, car quand une instance d’un type valeur est assignée à une variable, une copie de la valeur est effectuée.Value type objects cannot have reference equality because when an instance of a value type is assigned to a variable, a copy of the value is made. Ainsi, vous ne pouvez jamais avoir deux structs unboxed qui référencent le même emplacement en mémoire.Therefore you can never have two unboxed structs that refer to the same location in memory. De plus, si vous utilisez ReferenceEquals pour comparer deux types valeur, le résultat est toujours false, même si les valeurs contenues dans les objets sont toutes identiques.Furthermore, if you use ReferenceEquals to compare two value types, the result will always be false, even if the values that are contained in the objects are all identical. Cela est dû au fait que chaque variable est convertie en une instance d’objet distincte.This is because each variable is boxed into a separate object instance. Pour plus d'informations, voir Procédure : Tester l’égalité des références (Identité).For more information, see How to: Test for Reference Equality (Identity).

Égalité des valeursValue equality

L’égalité de valeur signifie que deux objets contiennent les mêmes valeurs.Value equality means that two objects contain the same value or values. Pour les types valeur primitifs tels que int ou bool, les tests d’égalité de valeur sont simples.For primitive value types such as int or bool, tests for value equality are straightforward. Vous pouvez utiliser l’opérateur ==, comme indiqué dans l’exemple suivant.You can use the == operator, as shown in the following example.

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

Pour la plupart des autres types, les tests d’égalité de valeur sont plus complexes parce qu’ils vous demandent de comprendre comment le type la définit.For most other types, testing for value equality is more complex because it requires that you understand how the type defines it. Pour les classes et structs qui ont plusieurs champs ou propriétés, l’égalité de valeur signifie souvent que tous les champs ou propriétés ont la même valeur.For classes and structs that have multiple fields or properties, value equality is often defined to mean that all fields or properties have the same value. Par exemple, deux objets Point peuvent être définis comme équivalents si pointA.X est égal à pointB.X et que pointA.Y est égal à pointB.Y.For example, two Point objects might be defined to be equivalent if pointA.X is equal to pointB.X and pointA.Y is equal to pointB.Y.

Toutefois, il n’est pas obligatoire que l’équivalence soit basée sur tous les champs dans un type.However, there is no requirement that equivalence be based on all the fields in a type. Elle peut être basée sur une partie.It can be based on a subset. Quand vous comparez des types dont vous n’êtes pas propriétaire, vous devez bien comprendre comment l’équivalence est définie pour ce type.When you compare types that you do not own, you should make sure to understand specifically how equivalence is defined for that type. Pour plus d’informations sur la façon de définir l’égalité de valeur dans vos propres classes et structs, consultez Guide pratique pour définir l’égalité de valeurs pour un type.For more information about how to define value equality in your own classes and structs, see How to: Define Value Equality for a Type.

Égalité des valeurs à virgule flottanteValue equality for floating-point values

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.Equality comparisons of floating-point values (double and float) are problematic because of the imprecision of floating-point arithmetic on binary computers. Pour plus d’informations, consultez les notes dans la rubrique System.Double.For more information, see the remarks in the topic System.Double.

TitreTitle DescriptionDescription
Guide pratique pour tester l’égalité des références (Identité)How to: Test for Reference Equality (Identity) Décrit comment déterminer si deux variables présentent une égalité de référence.Describes how to determine whether two variables have reference equality.
Guide pratique pour définir l’égalité de valeurs pour un typeHow to: Define Value Equality for a Type Décrit comment fournir une définition personnalisée de l’égalité de valeur pour un type.Describes how to provide a custom definition of value equality for a type.
Guide de programmation C#C# Programming Guide Fournit des liens vers des informations détaillées sur les fonctionnalités et les fonctions clés du langage C# disponibles en C# par l’intermédiaire du .NET Framework.Provides links to detailed information about important C# language features and features that are available to C# through the .NET Framework.
TypesTypes Fournit des informations sur le système de typeC# et des liens vers des informations supplémentaires.Provides information about the C# type system and links to additional information.

Voir aussiSee also