Pourquoi utiliser l'un plutôt que l'autre?
Réponses
Trop de publicités?== est le test d'identité. Elle renvoie true si les deux objets testés sont en fait le même objet. Equals()
effectue un test d'égalité, et renvoie true si les deux objets se considèrent égaux.
Test d'identité est plus rapide, de sorte que vous pouvez l'utiliser quand il n'y a pas besoin de plus cher tests d'égalité. Par exemple, en comparant à l'encontre null
ou la chaîne vide.
Il est possible de surcharger une de ces options pour fournir un comportement différent-comme l'identité des tests pour Equals()
--, mais pour le bien de la personne la lecture de votre code, veuillez ne pas faire.
L'a souligné ci-dessous: certains types, comme String
ou DateTime
fournir des surcharges pour l' ==
de l'opérateur qui lui donnent de l'égalité sémantique. Ainsi, le comportement exact dépendra des types des objets de la comparaison.
Voir aussi:
L'a souligné ci-dessous: une valeur de type DateTime fournir des surcharges de l'opérateur = = >qui lui donnent de l'égalité sémantique. Ainsi, le comportement exact dépendra des types de l' >objets que vous comparez.
À préciser:
DateTime est mis en œuvre comme une struct. Toutes les structures sont des enfants de Système.ValueType.
Depuis Que Le Système.ValueType enfants de vivre sur la pile, il n'y a pas de référence pointeur sur le tas, et donc aucun moyen de vérifier les références, vous devez comparer des objets par valeur.
Système.ValueType remplace .Equals() et == utilisation d'une réflexion basée sur l'égalité de vérifier, il utilise la réflexion pour comparer chaque champs de valeur.
Parce que la réflexion est un peu lent, si vous implémentez votre propre structure, il est important de remplacer .Equals() et ajouter votre propre valeur de code de vérification, comme ce sera beaucoup plus rapide. Ne les appelez pas de base.Equals();
Tout le monde a à peu près vous, mais j'ai un mot de plus de conseils. Chaque maintenant et encore une fois, vous aurez quelqu'un qui jure sur sa vie (et celle de ses proches).Égale est plus efficace/mieux/meilleures pratiques ou de certains autres dogmatique ligne. Je ne peux pas parler de l'efficacité (bon, OK, dans certaines circonstances, je peux), mais je peux parler à un gros problème qui va surgir: .Est égal nécessite un objet pour exister. (Semble stupide, mais il jette les gens.)
Vous ne pouvez pas effectuer les opérations suivantes:
StringBuilder sb = null;
if (sb.Equals(null))
{
// whatever
}
Il me semble évident, et peut-être la plupart des gens, que vous obtiendrez une exception NullReferenceException. Cependant, les tenants de .Est égal à oublier ce petit factoid. Certains sont même "jeté" off (désolé, pas pu résister) quand ils voient le NullRefs commencent à apparaître.
(Et des années avant que le DailyWTF l'affichage, je n'ai fait de travailler avec quelqu'un qui a mandaté que tous les contrôles d'égalité .Est égal au lieu de ==. Même la preuve de sa inexactitude n'a pas aidé. Nous venons de faire sacrément sûr de briser tous ses autres règles de sorte qu'aucune référence renvoyée à partir d'une méthode, ni la propriété n'a jamais été nulle, et il a travaillé à la fin.)
== est généralement "l'identité" est égal à la signification de "l'objet a est en fait exactement le même objet en mémoire comme objet b".
equals() signifie que les objets logiquement égale (par exemple, à partir d'un point de vue commercial). Donc, si vous comparez les instances d'une classe définie par l'utilisateur, vous avez généralement besoin d'utiliser et de définir equals() si vous voulez des choses comme une table de hachage pour fonctionner correctement.
Si vous avez eu la proverbiale Personne de la classe avec des propriétés "Nom" et "Adresse" et que vous vouliez utiliser cette Personne comme une clé dans une table de hachage contenant plus d'informations à leur sujet, vous devez implémenter equals() (hachage), de sorte que vous pouvez créer une instance d'une Personne et de l'utiliser comme une clé dans la table de hachage pour obtenir l'information.
L'utilisation de == seul, votre nouvelle instance serait pas la même.
Selon MSDN:
En C#, il existe deux types d'égalité: référence de l'égalité (aussi connu comme l'identité) et de la valeur de l'égalité. La valeur d'égalité est généralement comprise sens de l'égalité: il signifie que les deux objets contiennent les mêmes valeurs. Par exemple, deux entiers avec la valeur de 2 ont de la valeur d'égalité. Référence de l'égalité signifie qu'il n'y a pas deux objets à comparer. Au lieu de cela, il y a deux références de l'objet et deux d'entre eux font référence au même objet.
...
Par défaut, l'opérateur == tests de référence de l'égalité de déterminer si deux références indiquent le même objet.