type var et identité d'objet (struc)
Bonjour, je débute en C# et en Poo, cela fait beaucoup pour un seul homme.
J'aimerais m'assurer que j'ai bien compris les concepts de base.
Je crée deux variables dont l'une est de type var. A celle-ci j'affecte une valeur double, puis j'affecte l'autre variable, d'un autre type (int).
La variable var devient équivalente à la variable int mais conserve son type de première affectation (double).
A être équivalentes (i1 == vari1 renvoit true, la méthode equals() pareil), ces deux variables n'en restent pas moins des objets (struct) distincts: pas le même hashcode.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
int i1 = 3;
var vari1 =3.2; // vari1 est détecté double
vari1 = i1; // vari1 reste double
Console.WriteLine(vari1.Equals(i1)); //True
Console.WriteLine("vari1: "+ vari1.ToString()+" " +vari1.GetType()); //3 double
Console.WriteLine("i1: " + i1.ToString() + " " + i1.GetType()); // 3 int
Console.WriteLine(i1.GetHashCode()+ " vari1 "+vari1.GetHashCode()); // hashcode différents
bool hcode1 = i1.GetHashCode() == vari1.GetHashCode(); //false
Console.WriteLine(hcode1.ToString()); //false
Console.WriteLine(i1 == vari1);//True
Console.Read(); |
Par contre, si j'affecte à la variable var le même type que l'autre variable (ici double), le comportement change radicalement: les deux variables deviennent le même objet (struc) puisqu'elles ont le même hashcode.
Code:
1 2 3 4 5 6 7 8 9 10 11
|
double i2 = 3;
var vari2 = 3.2; //var est détecté double
vari2 = i2; // i2 et vari2 ayant même type, ils deviennent le même object (ou struct)
Console.WriteLine(vari2.Equals(i2)); //True
Console.WriteLine("vari2: " + vari2.ToString() + " " + vari2.GetType()); //3 double
Console.WriteLine("i2: " + i2.ToString() + " " + i2.GetType()); // 3 double
bool hcode2 = i2.GetHashCode() == vari2.GetHashCode(); //true
Console.WriteLine(hcode2.ToString());//true
Console.WriteLine(i2 == vari2);//true |
Ai-je bien tout compris ?
J'en doute car si je rajoute ces petits bouts de code à la fin:
Code:
1 2 3 4 5 6 7 8 9
|
i1 = 4;
vari1 = 5;
Console.WriteLine("i1: " + i1 + " -- vari1: " + vari1); // 4 et 5
i2 = 4;
vari2 = 5;
Console.WriteLine("i2: " + i2 + " -- vari2: " + vari2); // 4 et 5
Console.WriteLine(i2.GetHashCode() + " " + vari2.GetHashCode()); // hashcode différents |
i2 et vari2 redeviennent différents, ils n'ont plus le même hashcode.
D'avance, merci pour vos commentaires.