aiguisez votre c#
DESCRIPTION
Présention sur certains aspects du C# fait à la communaté .Net de Montréal le 23 janvier 2012TRANSCRIPT
AIGUISEZ VOTRE C#
PRÉSENTATION
• Vincent Hubert• Consultant indépendant • Hubiq (www.hubiq.net)• Travaille proche du métal
– C++, .Net– Appareils médicaux, TPV,
Borne interactive, vision artificielle, simulateurs ATC
QUELQUES NOTIONS DE BASE
Fruit
Pomme
Cortland GrannySmith Golden
CONTRAVARIANCE ET COVARIANCE
• 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.
UN EXEMPLE CONCRET
ATTENTION, MÉTHODES EN SURCHARGE
Pomme maPomme = new Cortland();
maPomme.ConfigurePelure(5);
Question Quiz:
Quelle est la signature originale de la méthode appelée ci-bas?
ATTENTION, 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 ?
ATTENTION, MÉTHODES EN SURCHARGE
• Les différentes surcharges d’une même méthode doivent impérativement avoir la même sémantique.
ATTENTION, MÉTHODES EN SURCHARGE
Class PanierDePomme{…
// Ajoute une pomme au panierpublic Ajouter(Pomme maPomme){…}
// Ajoute des vitamines à chaque pomme
public Ajouter(Vitamine maVit) {…}
}
MA
L
ATTENTION, 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)
VOUS POUVEZ DISPOSER
• À quoi sert le patron de conception « dispose » en .Net?
• Sous quelle condition devez-vous presque assurément rendre votre classe « IDisposable »
VOUS 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; } }
VOUS POUVEZ DISPOSER
using (var DbConn = new DBConnection() ){
// Élidé}
• Le mot clé « using » permet de simplifier l’application du patron et de garantir l’exécution du dispose.
FINALEMENT… FINALLY
try{ ... }finally{ ... }
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
GETHASHCODE
• 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.
UN CHIP AVEC ÇA?
Machine 1 Machine 2
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!
NEW KID ON THE BLOCK
• Quelle est la seule bonne raison d’utiliser le mot-clé « new » sur une définition de méthode?
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.