Lorsque vous avez initialisé
object x = "mehdi emrani"; //pointer(x)
Il l'a initialisé dans la mémoire et lui a assigné une référence à x. Après cela, lorsque vous avez initialisé
string y = "mehdi emrani"; //pointer(x)
le compilateur constate que cette valeur est déjà en mémoire et attribue donc la même référence à y.
Ahora ==
L'opérateur equal, qui compare les adresses au lieu de la valeur, trouve la même adresse pour les deux variables, ce qui donne un résultat correct :
x==y //actually compares pointer(x)==pointer(x) which is true
Dans le second cas, lorsque vous initialisez x et y, des adresses différentes leur sont attribuées.
object x = "mehdi emrani"; //Pointer(x)
string y = "mehdi "; //not found in memory
y += "emrani"; //Pointer(y)
Maintenant, la comparaison trouve des adresses différentes qui donnent des résultats erronés :
x == y //is actually Pointer(x) == Pointer(y) which is false
Pour y remédier, vous devez donc utiliser la fonction Equals() qui, au lieu de la référence, compare la valeur et le type d'objet.
Console.WriteLine(y.Equals(x)); //compares "mehdi emrani" == "mehdi emrani" results true
0 votes
Pour comparer des chaînes de caractères, vous devez toujours utiliser la fonction
.Equals
fonction3 votes
@RononDex Il dit Pourquoi ?
11 votes
@RononDex : c'est vrai pour java mais pas pour C#, normalement on compare des chaînes de caractères, puis la fonction
==
est surchargé, ce qui présente l'avantage de pouvoir gérer lesnull
correctement.1 votes
Lisez attentivement les messages d'avertissement du compilateur C#. Ils essaient de vous aider et de vous guider. Dans votre cas, vous obtenez avertissement CS0253 : Comparaison de référence involontaire possible ; pour obtenir une comparaison de valeur, convertir le côté droit en type 'string'. . Cela devrait vous alarmer et vous donner l'explication que vous cherchez.