C# - marc.chevaldonne.free.frmarc.chevaldonne.free.fr/ens_rech/Csharp_XML_GI_2010_2011_files/... ·...
Transcript of C# - marc.chevaldonne.free.frmarc.chevaldonne.free.fr/ens_rech/Csharp_XML_GI_2010_2011_files/... ·...
création de types en C#Héritage : syntaxe, overload
• Héritage (proche C++)• syntaxe (cf. exemple 15)
• accesseur protected• constructeur : appel du ctor de la classe mère avec base• sealed : accesseur pour empêcher l’héritage ou l’overload
de méthodes• method or field overload : (cf. exemple 16)
• conseillé d’utiliser new pour montrer que c’est intentionnel...• ... mais plutôt déconseillé de surcharger les méthodes dans
les classes filles dans une API
2
lundi 13 septembre 2010
création de types en C#Héritage : initialiseurs et constructeurs
• Héritage (proche C++)• initialiseurs et constructeurs (cf. exemple 17) :
• initializers statiques de la classe fille• constructeur statique de la classe fille• initializers (instance) de la classe fille• initializers statiques de la classe mère• constructeur statique de la classe mère• initializers (instance) de la classe mère• constructeur (instance) de la classe mère• constructeur (instance) de la classe fille
3
lundi 13 septembre 2010
création de types en C#Héritage : casting
• Héritage (proche C++) • Casting (cf. exemple 18)
• Upcasting : implicite• Downcasting
• operator is• operator as
• plus sûr que le cast aveugle (C-like) + exception• plus rapide en exécution• => à préférer
4
lundi 13 septembre 2010
création de types en C#Héritage/Polymorphisme
• Héritage et Polymorphisme (proche C++)• virtual (cf. exemple 19)• new vs virtual vs override (cf. exemples 16 et 19)
• Classes abstraites (cf. exemple 20)
5
lundi 13 septembre 2010
création de types en C#Immutabilité et structures
• Immutabilité• différentes immutabilités
• la vraie : constante, la valeur ne change jamais• write-once immutability : la valeur est initialisée une seule fois, puis ne
change jamais• shallow vs deep immutability : shallow immutability veut dire que la
valeur est non mutable mais qu’elle contient des membres «de type référence» mutables (e.g. un tableau)
• immutable façades : semblent immutables de l’extérieur (ne peuvent pas être modifiées de l’extérieur) mais changent de l’intérieur
• avantages : • plus sûr (nécessite moins de vérifications)• thread safe : accessible en lecture par plusieurs threads simultanés• utilisables dans les tables de hâchage• ...
• conseil : écrivez vos structures write-once immutable
6
lundi 13 septembre 2010
création de types en C#Interfaces
• Interfaces (cf. exemple 23)• différences avec les classes (abstraites)
• préférez une classe et des sous-classes lorsqu’elles doivent partager une même implémentation => définition de types
• préférez une interface et des implémentations lorsque ces dernières sont indépendantes => définition de fonctionnalités
• améliorent l’encapsulation
interfaces classes
une classe peut implémenter plusieurs interfaces une classe ne peut dériver que d’une seule classe
tous les membres d’une interface sont abstraits une classe abstraite peut avoir des membres abstraits et des membres concrets
les structures peuvent implémenter des interfaces une structure ne peut pas hériter d’une classe
7
lundi 13 septembre 2010
création de types en C#Boxing Unboxing
• boxing unboxing• boxing : cast d’un type valeur vers un type référence
int x = 3;object obj = x;
• unboxing : cast d’un type référence vers un type valeurint y = (int) obj;
• lent => à éviter• interfaces et boxing
interface I { void Method(); }struct S : I { public void Method() {} }
• si on cast l’interface en struct => pas de boxingS s = new S(); /*pas de boxing*/ s.Method();
• si on cast une structure en une interface => boxingI i = s; /* boxing*/ i.Method();
8
lundi 13 septembre 2010
C# avancéNullable Types
• Nullable types (cf. exemple 25)• permettent de représenter des valeurs null pour des types
«valeur»• Nullable<T> : structure légère et non mutable
• Value et HasValue• conversion de T vers T? implicite• conversion de T? vers T explicite
9
lundi 13 septembre 2010
Fondamentaux de la plateforme .NETstring et StringBuilder
• string (cf. exemple 26)• séquence non mutable de caractères• construction• string vide ou null• chercher• manipuler• comparaison de string
• StringBuilder (cf. exemple 27)• mutable• plus rapide et plus efficace que le string
10
lundi 13 septembre 2010
Fondamentaux de la plateforme .NETFormatting and Parsing / la Console
• Formatting and Parsing (cf. exemple 28)• Formatting = convertir en string (par défaut, ToString)• Parsing = convertir depuis un string (par défaut, Parse sur de
nombreux types)• ToString Parse TryParse• IFormatProvider
• Standard Numeric Format Strings• Custom Numeric Format Strings• Enumeration Format Strings
• la Console (cf. exemple 29)
11
lundi 13 septembre 2010
Utilisation de Visual Studio 2010
• environnement de travail
• solutions, projets, explorateur de solutions
• explorateur de classes
• compilation et exécution
• debuggeur
12
lundi 13 septembre 2010
Fondamentaux de la plateforme .NETDate Time Math
• TimeSpan (cf. exemple 30)• Standard TimeSpan Format Strings• Custom TimeSpan Format Strings
• Date Time (cf. exemple 30)• Standard Date and Time Format Strings• Custom Date and Time Format Strings
• Math• Min Max Abs Cos Exp...
• Random (cf. exemple 31)
13
lundi 13 septembre 2010
création de types en C#Generics
• 2 solutions pour écrire du code réutilisable à travers différents types : l’héritage et la généricité• héritage : réutilisablité à travers un type de base• généricité : réutilisabilité à travers un «patron»
• Généricité (cf. exemples 32 à 40)• introduction
• définition du problème (cf. exemple 32)• et pourquoi pas object ? (cf. exemple 33)
• syntaxe (cf. exemple 34)• default (cf. exemple 35)• contraintes : where -> base-class, interface, class, struct, new()
(cf. exemple 36 et 37)• héritage (cf. exemple 38)
14
lundi 13 septembre 2010
création de types en C#Generics
• Généricité (cf. exemples 32 à 40)• covariance :
• soit C une classe qui hérite de B• un type X est dit covariant si X<C> peut être converti en
X<B>
• les classes NE SONT PAS covariantes (cf. exemple 39) • les interfaces SONT covariantes (cf. exemple 40)• les tableaux SONT covariants• les délégués sont covariants
• contravariance :• soit C une classe qui hérite de B• un type X est dit contravariant si X<B> peut être converti en
X<C> 15
lundi 13 septembre 2010
CollectionsIntroduction
• ensemble standard de types pour stocker et gérer des collections d’objets
‣ listes de taille dynamique‣ listes chaînées‣ dictionnaires (triés ou non)‣ tableaux‣ ...
lundi 13 septembre 2010
CollectionsIntroduction
• ensemble standard de types pour stocker et gérer des collections d’objets
‣ listes de taille dynamique‣ listes chaînées‣ dictionnaires (triés ou non)‣ tableaux‣ ...
• Qu’est-ce qu’on trouve dans les espaces de noms de Collections ? (System.Collections, System.Collections.Generic, System.Collections.Specialized, System.Collections.ObjectModel)
‣ des interfaces (définition de protocoles pour les collections)
‣ des classes de collections prêtes à l’emploi (lists, dictionaries, arrays ...)
‣ des classes de base pour écrire vos propres collections
lundi 13 septembre 2010
CollectionsIntroduction
• ensemble standard de types pour stocker et gérer des collections d’objets
‣ listes de taille dynamique‣ listes chaînées‣ dictionnaires (triés ou non)‣ tableaux‣ ...
• Qu’est-ce qu’on trouve dans les espaces de noms de Collections ? (System.Collections, System.Collections.Generic, System.Collections.Specialized, System.Collections.ObjectModel)
‣ des interfaces (définition de protocoles pour les collections)
‣ des classes de collections prêtes à l’emploi (lists, dictionaries, arrays ...)
‣ des classes de base pour écrire vos propres collections
‣ égalités, hashcode, etc... => plus tard
on va en parler un peu
on va en parler beaucoup
pas le temps
lundi 13 septembre 2010
CollectionsUn tout petit peu d’histoire...
• Avant C# 2, les Generics n’existaient pas, les collections n’étaient pas génériques
• Avec C# 2 et l’arrivée de la généricité, les collections sont devenues génériques,
• mais les anciennes sont restées, et certains liens subsistent...
➡Nous parlerons surtout des collections génériques
lundi 13 septembre 2010
CollectionsInterfaces
IEnumerator IEnumerator<T>
IEnumerable IEnumerable<T>
ICollection ICollection<T>
IDictionary IList IList<T> IDictionary<TKey, TValue>
non génériques génériques
lundi 13 septembre 2010
CollectionsInterfaces
IEnumerator IEnumerator<T>
IEnumerable IEnumerable<T>
ICollection ICollection<T>
IDictionary IList IList<T> IDictionary<TKey, TValue>
non génériques génériques
pour traverserune collection
pour utiliser foreach
lundi 13 septembre 2010
CollectionsInterfaces
IEnumerator IEnumerator<T>
IEnumerable IEnumerable<T>
ICollection ICollection<T>
IDictionary IList IList<T> IDictionary<TKey, TValue>
non génériques génériques
permet de compter,d’ajouter, d’enlever (...) des éléments d’une collection
lundi 13 septembre 2010
CollectionsInterfaces
IEnumerator IEnumerator<T>
IEnumerable IEnumerable<T>
ICollection ICollection<T>
IDictionary IList IList<T> IDictionary<TKey, TValue>
non génériques génériques
permet d’accéder aux éléments par indice (tableau)
lundi 13 septembre 2010
CollectionsInterfaces
IEnumerator IEnumerator<T>
IEnumerable IEnumerable<T>
ICollection ICollection<T>
IDictionary IList IList<T> IDictionary<TKey, TValue>
non génériques génériques stocke des paires clé/valeurtables de hachage, etc...
lundi 13 septembre 2010
CollectionsIEnumerable<T> et IEnumerator<T>
public interface IEnumerator{ bool MoveNext(); object Current { get; } void Reset();}
public interface IEnumerator<T> : IEnumerator, IDisposable{ T Current { get; }}
public interface IEnumerable{ IEnumerator GetEnumerator();}
public interface IEnumerable<T> : IEnumerable{ IEnumerator<T> GetEnumerator();}
• Comment utiliser une collection qui hérite de IEnumerable<T> ?‣ avec un foreach
‣ en récupérant un énumérateur et en utilisant MoveNext et Current
‣ cf exemple 41
lundi 13 septembre 2010
CollectionsIEnumerable<T> et IEnumerator<T>
public interface IEnumerator{ bool MoveNext(); object Current { get; } void Reset();}
public interface IEnumerator<T> : IEnumerator, IDisposable{ T Current { get; }}
public interface IEnumerable{ IEnumerator GetEnumerator();}
public interface IEnumerable<T> : IEnumerable{ IEnumerator<T> GetEnumerator();}
• Pourquoi dériver de IEnumerable<T> ?‣ pour pouvoir utiliser foreach ...
‣ ... sur sa propre collection non standard
‣ pour faire une énumération plus complexe
‣ cf exemples 42 et 43
lundi 13 septembre 2010
CollectionsICollection<T>
public interface ICollection<T> : IEnumerable<T>, IEnumerable{ int Count (); void Add (T item); bool Remove (T item); void Clear (); bool Contains (T item); void CopyTo (T[] array, int arrayIndex); bool IsReadOnly { get; }}
comptage
insertion à la fin (append)nettoyage
qqs recherches simples
lundi 13 septembre 2010
CollectionsIList<T>
public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable{ T this [int index] { get; set; }
int IndexOf (T item);
void Insert (int index, T item); void RemoveAt (int index);}
indexeur
insertion à une place précise
qqs recherches simples
lundi 13 septembre 2010
CollectionsLes classes de base implémentant ICollection<T> et IList<T>
• Array
• List<T>
• Queue<T>
• Stack<T>
• LinkedList<T>
• BitArray
• HashSet<T>
lundi 13 septembre 2010
CollectionsLes classes de base implémentant ICollection<T> et IList<T>
• Array
• List<T>
• Queue<T>
• Stack<T>
• LinkedList<T>
• BitArray
• HashSet<T>
• hérite de IList<T>, IList et ICloneable
• permet de :‣ construire,‣ indexer,‣ enumérer,‣ trier,‣ inverser les éléments,‣ copier les éléments‣ ...
• cf. exemples 3 et 44
lundi 13 septembre 2010
CollectionsLes classes de base implémentant ICollection<T> et IList<T>
• Array
• List<T>
• Queue<T>
• Stack<T>
• LinkedList<T>
• BitArray
• HashSet<T>
• FIFO : First In First Out
• permet de :‣ rajouter des éléments dans la file (Enqueue),‣ retirer l’élément suivant de la file (Dequeue),‣ connaître l’élément suivant de la file sans le retirer (Peek)‣ compter le nombre d’éléments de la file
• cf. exemple 45
lundi 13 septembre 2010
CollectionsLes classes de base implémentant ICollection<T> et IList<T>
• Array
• List<T>
• Queue<T>
• Stack<T>
• LinkedList<T>
• BitArray
• HashSet<T>
• LIFO : Last In First Out
• permet de :‣ rajouter un élément au-dessus de la pile (Push),‣ retirer l’élément en haut de la pile (Pop),‣ connaître l’élément en haut de la pile sans le retirer (Peek)‣ compter le nombre d’éléments de la file
• cf. exemple 46
lundi 13 septembre 2010
CollectionsLes classes de base implémentant ICollection<T> et IList<T>
• Array
• List<T>
• Queue<T>
• Stack<T>
• LinkedList<T>
• BitArray
• HashSet<T>
• Liste doublement chaînée
• ne possède pas d’indexeur
• mais l’insertion est rapide (sauf s’il faut chercher où l’insérer)
• cf. exemple 47
lundi 13 septembre 2010
CollectionsLes classes de base implémentant ICollection<T> et IList<T>
• Array
• List<T>
• Queue<T>
• Stack<T>
• LinkedList<T>
• BitArray
• HashSet<T>
• Champ de bits
lundi 13 septembre 2010
CollectionsLes classes de base implémentant ICollection<T> et IList<T>
• Array
• List<T>
• Queue<T>
• Stack<T>
• LinkedList<T>
• BitArray
• HashSet<T>
• même idée que la table de hachage sans la valeur...
lundi 13 septembre 2010
CollectionsLes classes de base implémentant ICollection<T> et IList<T>
• Array
• List<T>
• Queue<T>
• Stack<T>
• LinkedList<T>
• BitArray
• HashSet<T>
• La classe de base la plus utilisée
• rapide pour des insertions en fin de liste• rapide en BinarySearch pour des listes triées• lent pour des insertions• cf. exemple 48
lundi 13 septembre 2010
CollectionsList<T>
public class List<T> : IList<T>{ public List (); public List (IEnumerable<T> collection); public List (int capacity); public void Add (T item); public void AddRange (IEnumerable<T> collection); public void Insert (int index, T item); public void InsertRange (int index, IEnumerable<T> collection);
public bool Remove (T item); public void RemoveAt (int index); public void RemoveRange (int index, int count); public int RemoveAll (Predicate<T> match);
public T this [int index] { get; set; } public List<T> GetRange (int index, int count); public Enumerator<T> GetEnumerator();
...}
construction
insertions
enlever des éléments
indexer
lundi 13 septembre 2010
CollectionsList<T>
public class List<T> : IList<T>{ ...
public T[] ToArray(); public void CopyTo (T[] array); (+2 autres) public ReadOnlyCollection<T> AsReadOnly(); public List<TOutput> ConvertAll (Converter <T, TOutput> converter);
public void Reverse(); public int Capacity { get; set; } public void TrimExcess(); public void Clear(); + recherches, tris comme dans Array, mais en méthodes d’instances}
export et copie
autres
lundi 13 septembre 2010
CollectionsReadOnlyCollection<T>
• Permet de n’avoir accès à une collection qu’en lecture
• Attention aux types références !
• cf. exemple 49
lundi 13 septembre 2010