Le code qui utilise static Object.Equals pour vérifier la valeur NULL est-il plus robuste que le code qui utilise l'opérateur == ou regular Object.Equals ? Les deux derniers ne sont-ils pas susceptibles d'être remplacés de telle manière que la recherche de la valeur NULL ne fonctionne pas comme prévu (par exemple, renvoyer false lorsque la valeur comparée est null)?
En d'autres termes, est-ce:
if (Equals(item, null)) { /* Do Something */ }
plus robuste que cela:
if (item == null) { /* Do Something */ }
Personnellement, je trouve cette dernière syntaxe plus facile à lire. Devrait-il être évité lors de l'écriture d'un code qui gérera des objets en dehors du contrôle de l'auteur (par exemple, des bibliothèques)? Devrait-il toujours être évité (lors de la vérification de null)? Est-ce juste couper les cheveux?
if (Equals(item, null))
n'est pas plus robuste que if (item == null)
, et je trouve plus déroutant de démarrer.
Le framework guidelines suggère de traiter Equals
comme une égalité de valeurs (vérifier si deux objets représentent la même information, c’est-à-dire des propriétés comparées), et ==
comme une égalité de référence, à l’exception des objets immuables, pour lesquels vous devriez probablement remplacer ==
pour être une égalité de valeur.
Donc, en supposant que les directives s'appliquent ici, choisissez celle qui est sémantiquement raisonnable. Si vous avez affaire à des objets immuables et que vous attendez des deux méthodes des résultats identiques, j'utiliserais ==
pour plus de clarté.
En ce qui concerne "... le code qui gérera des objets échappant au contrôle de l'auteur ...", je tiens à souligner que l'opérateur statique Object.Equals
et l'opérateur ==
sont des méthodes statiques et ne peuvent donc pas être virtuels/remplacés. La mise en œuvre appelée est déterminée au moment de la compilation en fonction du ou des types statiques. En d'autres termes, il n'y a aucun moyen pour une bibliothèque externe de fournir une version différente de la routine à votre code compilé.