3. Q UELQUES NOTIONS DE BASE
Fruit
Pomme
Cortland GrannySmith Golden
4. C ONTRAVARIANCE ET C OVARIANCE
• COVARIANCE
– SUBSTITUER UN TYPE PLUS
DÉRIVÉ QUE CELUI QUI EST
ATTENDU
• Par exemple, le paramètre d’une
méthode.
• CONTRAVARIANCE
– SUBSTITUER UN TYPE DE BASE À
CELUI QUI EST ATTENDU
• Par exemple, une valeur de
retour.
6. A TTENTION , MÉTHODES EN SURCHARGE
Question Quiz:
Quelle est la signature originale de la
méthode appelée ci-bas?
Pomme maPomme = new Cortland();
maPomme.ConfigurePelure(5);
7. A TTENTION , MÉTHODES EN SURCHARGE
• Pomme.ConfigurePelure(int param)
• Pomme.ConfigurePelure(int param, object
toto=null)
• Pomme.ConfigurePelure(double param)
• Pomme.ConfigurePelure<T>(T param)
• Pomme.ConfigurePelure<T>(T param, object
toto=null)
• MyExt.ConfigurePelure( this Pomme me, int
param)
• Myext.ConfigurePelure(this Pomme me, int
param, object toto=null)
• Myext.ConfigurePelure(this Pomme me, double
param, object toto=null)
– Et peut-être la même chose avec la classe de base
« Fruit »?
– Les dynamics? Param ?
8. A TTENTION , MÉTHODES EN SURCHARGE
• Les différentes
surcharges d’une même
méthode doivent
impérativement avoir la
même sémantique.
9. A TTENTION , MÉTHODES EN SURCHARGE
Class PanierDePomme
{
…
// Ajoute une pomme au panier
public Ajouter(Pomme maPomme){…}
// Ajoute des vitamines à chaque pomme
public Ajouter(Vitamine maVit) {…}
}
10. A TTENTION , MÉTHODES EN SURCHARGE
• Les différentes surcharges
d’une même méthode doivent
impérativement avoir la
même sémantique.
• Attention, chaque surcharge
additionnelle peut
augmenter la complexité sur
une base quasi-
exponentielle. (Exemple:
MessageBox)
11. V OUS POUVEZ DISPOSER
• À quoi sert le patron de
conception « dispose » en
.Net?
• Sous quelle condition
devez-vous presque
assurément rendre votre
classe « IDisposable »
12. V OUS POUVEZ DISPOSER
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass
// of this type implements a finalizer.
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
// If you need thread safety, use a lock.
if (!_disposed) {
if (disposing) {
if (_resource != null)
_resource.Dispose();
Console.WriteLine("Object disposed.");
}
// Indicate that the instance has been disposed.
_resource = null;
_disposed = true;
}
}
13. V OUS POUVEZ DISPOSER
• Le mot clé « using » permet
de simplifier l’application
du patron et de garantir
l’exécution du dispose.
using (var DbConn = new DBConnection() )
{
// Élidé
}
14. F INALEMENT … F INALLY
Probablement le mot clé le plus sous-utilisé
C’est la construction utilisée par le framework
pour les constructions lock() et using()
Attention aux exceptions dans le bloc finally
try
{ ... }
finally
{ ... }
15. G ETHASHCODE
• La méthode GetHashCode
doit être redéfinie si la
méthode equals est
redéfinie.
• Deux GetHashCode doivent
être égaux si equals
retourne true.
• GetHashCode doit
retourner des valeurs
bien distribuées.
17. UN CHIP AVEC ÇA?
• Les « named parameters »
– Discriminent les paramètres
de même type à l’appel – peu
importe l’ordre.
– Permettent de spécifier un
paramètre optionnel – peu
importe l’ordre.
– Attention: Le nom du
paramètre est résolu à la
compilation.
• Le nom du paramètre fait partie
du contrat!
18. N EW KID ON THE BLOCK
• Quelle est la seule bonne
raison d’utiliser le mot-
clé « new » sur une
définition de méthode?
19. UNSAFE PEUT-ÊTRE, MAIS VITE, VITE, VITE
• Les pointeurs existent en
C#.
• Un bloc unsafe permet d’y
définir des pointeurs.
• Les références doivent être
épinglées: fixed().
• Peuvent être beaucoup plus
rapide que l’alternative
managed.
– Surtout sur des tableaux
multi–dimensionnels.