La différence entre l'opérateur == et de la méthode Equals() en C#?
Quelle est la différence entre ==
et Equals()
avec exemple? Je sais que ==
est utilisé pour comparer l'opérateur et Equals()
méthode est utilisée pour comparer le contenu de la chaîne.J'ai donc essayé
//first example
string s1 = "a";
string s2 = "a";
Console.Write(a.Equals(s2)); //returns true, but if I assign "b" to s2,
//then result will be false
//second example
string s1 ="a";
string s2 ="a";
Console.Write(s1 == s2); //returns true
Comment est-ce donc? Les deux sont différents des références d'objet. Supposons que nous considérons qu'il s'agit de référence. Mais j'ai essayé de l'utiliser comme ceci
string s1 = new string("ab");
string s2 = new string("ab");
J'obtiens erreur de compilation qui ne peut pas convertir en chaîne de caractères char
- La méthode Equals() n'est pas seulement utilisé pour comparer le contenu d'une chaîne de caractères, il peut être utilisé pour comparer deux objets. Le
string
type en C# qui arrive à contenir une remplacer la méthode pourEquals()
qui permettra de comparer leurs valeurs (ce fait est très mal expliqué dans un certain nombre d'articles qui suggèrent queEquals()
est pour la comparaison de chaînes uniquement).
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs choses qui se passent. Tout d'abord, dans cet exemple:
Vous prétendez que:
Ce n'est pas vrai en raison de chaîne de stage.
s1
ets2
sont des références pour le même objet. La spécification C# garantit que - à partir de la section 2.4.4.5 du C# 4 spécification:Donc, dans ce cas particulier, vous obtenez toujours "vrai" même si vous avez imprimé
object.ReferenceEquals(s1, s2)
, ou si vous l'avez fait d'utiliser un véritable de référence de l'identité comparaison avec==
:Cependant, même si ces ont été des références à des objets distincts,
==
est surchargé pourstring
. La surcharge est un au moment de la compilation de décision la mise en œuvre à utiliser dépend du moment de la compilation des types des opérandes. Ainsi, par exemple:Comparer avec
object.Equals(object)
qui est une méthode virtuelle. Comme il arrive,String
surcharges cette méthode ainsi, mais surtout, il la remplace. Donc, si nous modifions notre code:... puis les deux appels à la méthode dans le code compilé sera simplement de
object.Equals(object)
, mais ils vont encore imprimés Vrai en raison de polymorphisme: la mise en œuvre dansString
sera utilisé.Voici ce qu'un appel à la surchargé méthode ressemblerait à:
d
àobject
, puisque c'est déjà un objet? Aussi, dans lea Equals b
partie, je voudrais appeler à la fois l'objet et le correcteur de la chaîne de surcharge, il est donc plus clairement quelle est la différence.Devis à partir de la documentation de Est égal à:
Et la opérateur == :
Maintenant, revenons à votre question: pourquoi ne
s1 == s2
retourne vrai? Les chaînes sont spéciaux des bêtes dans .NET. Ils représentent immuable types de référence. Ils sont internés dans .NET. Cela signifie que si vous avez 2 constantes de chaîne avec la même valeur, ils se réfèrent à la même instance de l'objet au moment de l'exécution.Citation de la la documentation:
object
. Mais même les références à différents objets de chaîne avec le même contenu serait de travailler aussi longtemps que le moment de la compilation les types impliqués sont à la fois de la chaîne, en raison de la surcharge d'opérateur. La documentation que vous avez cité est trompeuse, car elle suggère, il y a quelques manutention spéciale juste pour les chaînes de caractères - il n'y en a pas, c'est juste que la chaîne est un type de référence qui surcharge l'opérateur==.Vous êtes en train de penser semble Java-esque. En java, le
==
opérateur ne peut pas être personnalisé, de sorte que pour les types référence, il est toujours fait référence à l'égalité, même si cela signifie que la valeur de l'égalité pour les types primitifs. D'autre part,Equals
est pour vérifier la valeur de l'égalité dans les types de référence.Les choses sont différentes en C#, cependant. Les deux
Equals
et==
personnalisées peuvent être mises en œuvre. La différence est queEquals
est virtuelle (exemple) méthode, tandis queoperator==
est une méthode statique. A côté de cela, ils peuvent se comporter exactement de la même manière.Par défaut, les deux
Equals
et==
vérifier la référence à l'égalité pour les types référence, et la valeur de l'égalité pour les types de valeur. Cependant, pourstring
, les deux sont personnalisés afin de vérifier la valeur de l'égalité.