68 votes

Pourquoi ces deux comparaisons ont des résultats différents?

Pourquoi est-ce que le code de retour de la vraie:

new Byte() == new Byte()   // returns true

mais ce code retourne false:

new Byte[0] == new Byte[0] // returns false

143voto

Sergey Berezovskiy Points 102044

Parce qu' new Byte() crée de la valeur type, qui sont comparées à la valeur (par défaut, elle sera de retour byte valeur 0). Et new Byte[0] crée tableau, qui est un type de référence et rapport par référence (et ces deux instances de la matrice ont des références différentes).

Voir les Types de Valeur et les Types Référence de l'article pour plus de détails.

43voto

p.s.w.g Points 81433

Les octets sont des types de valeur .NET, ce qui signifie que l' == de l'opérateur retourne true si et seulement si les deux octets ont la même valeur. Ceci est également connu comme la valeur de l'égalité.

Mais les tableaux sont des types référence .NET, sens de l' == de l'opérateur retourne true si et seulement si elles se réfèrent à la même occurrence de tableau dans la mémoire. Ceci est également connu comme la référence de l'égalité ou de l'identité.

Notez que l' == de l'opérateur peut être surchargé à la fois référence et des types de valeur. System.String, par exemple, est un type de référence, mais l' == de l'opérateur pour les chaînes compare chaque caractère dans le tableau dans l'ordre. Voir les lignes Directrices pour la Surcharge Equals() et Operator == (Guide de Programmation C#).

Si vous voulez tester si les tableaux contiennent exactement les mêmes valeurs (dans l'ordre), vous devez envisager d'utiliser Enumerable.SequenceEqual au lieu de ==.

10voto

Zaheer Ahmed Points 12945

la comparaison de référence est en fait la comparaison adresse de pointeur, qui sont différentes c'est la raison pour renvoyer false et de la valeur de l'adresse pas de question, il compare la valeur.

Compilateur d'essayer de stocker le type de Valeur dans les registres, mais en raison du nombre limité de registres numéro de stockage de plus qui se passe dans la Pile avec des valeurs [Référence], pendant que le type de Référence est dans la pile, mais la valeur la tenue d'une adresse de l'adresse de mémoire dans le Tas.

Comparaison ici de comparer la valeur présente dans la pile, qui est dans le premier cas, pour les deux mêmes, alors que dans le second cas c'est l'adresse des tas qui sont différents.

reference

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X