L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Comparaisons d’égalité (Guide de programmation C#)
10/04/2025
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;
classTest
{
publicint Num { get; set; }
publicstring Str { get; set; }
publicstaticvoidMain()
{
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.
Fournit des informations sur les types d’enregistrements, qui testent par défaut l’égalité des valeurs.
Collaborer avec nous sur GitHub
La source de ce contenu se trouve sur GitHub, où vous pouvez également créer et examiner les problèmes et les demandes de tirage. Pour plus d’informations, consultez notre guide du contributeur.
Commentaires sur
.NET
.NET
est un projet open source. Sélectionnez un lien pour fournir des commentaires :
Les types anonymes en C# encapsulent un ensemble de propriétés en lecture seule dans un objet sans avoir à définir explicitement un type. Le compilateur génère un nom.
Découvrez les membres expression-bodied. Consultez des exemples de code qui utilisent la définition du corps d’expression pour les propriétés, les constructeurs, les finaliseurs, etc.
En savoir plus sur la boxe et le déboxing dans la programmation C#. Consultez les exemples de code et affichez des ressources supplémentaires disponibles.
Les indexeurs en C# permettent aux instances de classe ou de struct d’être indexées comme des tableaux. Vous pouvez définir ou obtenir la valeur indexée sans spécifier de type ou de membre d’instance.