web-dev-qa-db-fra.com

Égal à (item, null) ou item == null

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?

37
Joseph Sturtevant

if (Equals(item, null)) n'est pas plus robuste que if (item == null), et je trouve plus déroutant de démarrer.

4
Michael Burr

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é.

2
mquander

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é.

1
Daniel Pratt