Les apparentes contradictions qui apparaissent dans la question sont dues au fait que dans un cas, l' Equals
fonction est appelée sur un string
de l'objet, et dans l'autre cas, l' ==
opérateur est appelé sur l' System.Object
type. string
et object
mettre en œuvre l'égalité différemment les uns des autres (d'une valeur de vs référence respectivement).
Au-delà de ce fait, n'importe quel type permet de définir ==
et Equals
différemment, donc en général ils ne sont pas interchangeables.
Voici un exemple d'utilisation double
(de Joseph Albahari note du §7.9.2 de la spécification du langage C#):
double x = double.NaN;
Console.WriteLine (x == x); // False
Console.WriteLine (x != x); // True
Console.WriteLine (x.Equals(x)); // True
Il poursuit en disant que l' double.Equals(double)
méthode a été conçue pour fonctionner correctement avec les listes et les dictionnaires. L' ==
de l'opérateur, d'autre part, a été conçu pour suivre la norme IEEE 754 pour les types à virgule flottante.
Dans le cas spécifique de la détermination de la chaîne d'égalité, de l'industrie est préférable d'utiliser ni ==
ni string.Equals(string)
la plupart du temps. Ces méthodes déterminer si deux chaînes de caractères sont le même caractère, ce qui est rarement le comportement correct. Il est préférable d'utiliser string.Equals(string, StringComparison)
, ce qui vous permet de spécifier un type particulier de comparaison. En utilisant le bon de comparaison, vous pouvez éviter beaucoup de potentiel (très difficile à diagnostiquer) les bugs.
Voici un exemple:
string one = "Caf\u00e9"; // U+00E9 LATIN SMALL LETTER E WITH ACUTE
string two = "Cafe\u0301"; // U+0301 COMBINING ACUTE ACCENT
Console.WriteLine(one == two); // False
Console.WriteLine(one.Equals(two)); // False
Console.WriteLine(one.Equals(two, StringComparison.InvariantCulture)); // True
Les deux chaînes dans cet exemple, le même aspect ("Café"), cela peut être très difficile à déboguer si à l'aide d'un naïf (ordinale) l'égalité.