La source de votre confusion semble être qu'il y a une faute de frappe dans l'extrait de C# station, qui devrait indiquer : "... sauf que la méthode Equals ne fonctionne que sur les instances d'objets. La méthode ReferenceEquals est statique."
Vous avez raison dans les grandes lignes concernant les différences de significations sémantiques de chacun (bien que "différentes instances du même objet" semble un peu confus, cela devrait probablement dire "différentes instances du même type") et sur ceux qui peuvent être remplacés.
_Si nous laissons cela de côté, traitons la dernière partie de votre question, c'est-à-dire comment ils fonctionnent avec des instances d'objets System.Object
et des références System.Object
(nous avons besoin des deux pour contourner la nature non polymorphe de ==
). Ici, toutes les trois opérations fonctionneront de manière équivalente, mais avec une mise en garde : Equals
ne peut pas être invoqué sur null
.
Equals
est une méthode d'instance qui prend un paramètre (qui peut être null
). Puisqu'il s'agit d'une méthode d'instance (doit être invoquée sur un objet réel), elle ne peut pas être invoquée sur une référence null
.
ReferenceEquals
est une méthode statique qui prend deux paramètres, un ou les deux pouvant être null
. Puisqu'elle est statique (non associée à une instance d'objet), elle ne lancera pas d'NullReferenceException
dans toutes circonstances.
==
est un opérateur, qui, dans ce cas (object
), se comporte de manière identique à ReferenceEquals
. Il ne lancera pas d'NullReferenceException
non plus.
Pour illustrer :
object o1 = null;
object o2 = new object();
//Techniquement, ces devraient être object.ReferenceEquals pour plus de clarté, mais c'est redondant.
ReferenceEquals(o1, o1); //true
ReferenceEquals(o1, o2); //false
ReferenceEquals(o2, o1); //false
ReferenceEquals(o2, o2); //true
o1.Equals(o1); //NullReferenceException
o1.Equals(o2); //NullReferenceException
o2.Equals(o1); //false
o2.Equals(o2); //true_