Bonjour,
Je suis sur un truc con qui me laisse perplexe...
Mettons une classe Eleve :
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 classe Eleve { public int Id {get; set; } public string Nom { get; set; } public string Prenom { get; set; } }
Je souhaite mettre en place une comparaison qui permette de comparer deux élèves en ne se basant que sur leur identifiant.
J'ai donc écrit :
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public override bool Equals(object autre) { if (autre == null) return false; // Une instance n'est pas nulle et est donc différente de null Eleve autreEleve = autre as Eleve; if (autreEleve == null) return false; // L'autre instance n'est pas un élève, elle est forcément différente return Id == autreEleve.Id; }
Afin que ce soit plus simple à lire, je surcharge == et != :
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public static bool operator ==(Eleve id1, Eleve id2) { return id1.Equals(id2); } public static bool operator !=(object id1, CrmID id2) { return !id1.Equals(id2); }
Ca marche très bien tant que je compare des instances.
Sauf que dans mon code, j'ai souvent ce genre de choses :
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Eleve eleve = GetEleve(); // Peut renvoyer null if (eleve != null) { // Fait un truc }
Et là c'est le drame !
En effet, id1 est null, donc null.Equals(null) plante.
J'ai donc tenté de modifier le code en :
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public static bool operator ==(Eleve id1, Eleve id2) { if (id1 != null) { return id1.Equals(id2); } return false; } public static bool operator !=(Eleve id1, Eleve id2) { if (id1 != null) { return !id1.Equals(id2); } return true; }
Sauf que là le id1 != null dans l'opérateur != part en boucle et ça plante.
Je feinte...
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public static bool operator ==(object id1, Eleve id2) { if (id1 is Eleve) { if (id1 != null) { Eleve me = id1 as Eleve; return me.Equals(id2); } else { return id2 == null; } } else { return false; } } public static bool operator !=(object id1, Eleve id2) { return !(id1 == id2); }
Mais ça plante sur le id2 == null car on part à nouveau en boucle infinie.
Lol, et vu que j'adore trouver des solutions en posant mes question, voici la feinte ultime !
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 public override bool Equals(object other) { if (ReferenceEquals(this, other)) { return true; } else { Eleve otherID = other as Eleve; if (otherID is null) return false; else return Id == other.Id; } } public static bool operator ==(object id1, CrmID id2) { if (id1 is null) { return id2 is null; } else { return id1.Equals(id2); } } public static bool operator !=(object id1, CrmID id2) { return !(id1 == id2); }
Et plus généralement... toujours utiliser "is null" plutôt que "== null", ça évite de s'emmerder pour rien.
Partager