Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
C# .NET
Marc Chevaldonné[email protected]://marc.chevaldonne.free.fr
Année scolaire 2011 - 2012
1
lundi 5 septembre 2011
Bases du C#syntaxe, types
• 1er programme en C# (➠ exemple 1)• tout est objet
• Syntaxe• proche du C++ et Java, en plus verbeuse (plus de
modificateurs)• Les types : environ C++ (➠ exemple 2)
• suffixes (f pour float, L pour long, m pour decimal)• string• decimal• valeurs par défaut
2
lundi 5 septembre 2011
Bases du C#tableaux
• Les tableaux (cf. exemple 3)• syntaxe• accès aux cellules et dépassement• tableau d’object• propriété Length• copie de tableaux
• Clone• CopyTo
3
lundi 5 septembre 2011
Bases du C#types
• Les types 2 : types valeurs et types références• Stack and Heap• Reference counting• Value vs Reference • value type vs reference types
4
lundi 5 septembre 2011
Bases du C#Gestion de la mémoire : Stack vs Heap
static void Main(){
int i=3;
{
float temp = 23.0f;
temp /= i;
}
{
MyClass c = new MaClass();}
}
... 54 55 56 57 58 59 60 61 62 ...
... ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 23.0f23.0f23.0f23.0f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 7.6667f7.6667f7.6667f7.6667f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 adresseadresseadresseadresse ...
HeapStack
5
lundi 5 septembre 2011
Heap
Bases du C#Gestion de la mémoire : Stack vs Heap
static void Main(){
int i=3;
{
float temp = 23.0f;
temp /= i;
}
{
MyClass c = new MaClass();}
}
... 54 55 56 57 58 59 60 61 62 ...
... ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 23.0f23.0f23.0f23.0f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 7.6667f7.6667f7.6667f7.6667f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 adresseadresseadresseadresse ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
Stack
?
6
lundi 5 septembre 2011
Heap
Bases du C#Gestion de la mémoire : Stack vs Heap
static void Main(){
int i=3;
{
float temp = 23.0f;
temp /= i;
}
{
MyClass c = new MaClass();}
}
... 54 55 56 57 58 59 60 61 62 ...
... ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 23.0f23.0f23.0f23.0f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 7.6667f7.6667f7.6667f7.6667f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 adresseadresseadresseadresse ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
Stack
?
7
lundi 5 septembre 2011
Heap
Bases du C#Gestion de la mémoire : Stack vs Heap
static void Main(){
int i=3;
{
float temp = 23.0f;
temp /= i;
}
{
MyClass c = new MaClass();}
}
... 54 55 56 57 58 59 60 61 62 ...
... ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 23.0f23.0f23.0f23.0f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 7.6667f7.6667f7.6667f7.6667f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 adresseadresseadresseadresse ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
Stack
?
En C++, vous êtes
responsables de
l’allocation et de la
désallocation de la
mémoire sur le tas
8
lundi 5 septembre 2011
Heap
Bases du C#Gestion de la mémoire : Stack vs Heap
static void Main(){
int i=3;
{
float temp = 23.0f;
temp /= i;
}
{
MyClass c = new MaClass();}
}
... 54 55 56 57 58 59 60 61 62 ...
... ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 23.0f23.0f23.0f23.0f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 7.6667f7.6667f7.6667f7.6667f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 adresseadresseadresseadresse ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
Stack
?
En C#, les références des
objets alloués sur le tas
sont comptées et le
garbage collector
s’occupe de la
désallocation
9
lundi 5 septembre 2011
Bases du C#Gestion de la mémoire : Stack vs Heap
static void Main(){
int i=3;
{
float temp = 23.0f;
temp /= i;
}
{
MyClass c = new MaClass();}
}
... 54 55 56 57 58 59 60 61 62 ...
... ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 23.0f23.0f23.0f23.0f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 7.6667f7.6667f7.6667f7.6667f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 adresseadresseadresseadresse ...
HeapStack
1
10
lundi 5 septembre 2011
Heap
Bases du C#Gestion de la mémoire : Stack vs Heap
static void Main(){
int i=3;
{
float temp = 23.0f;
temp /= i;
}
{
MyClass c = new MaClass();}
}
... 54 55 56 57 58 59 60 61 62 ...
... ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 23.0f23.0f23.0f23.0f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 7.6667f7.6667f7.6667f7.6667f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 adresseadresseadresseadresse ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
Stack
0
GC
11
lundi 5 septembre 2011
Heap
Bases du C#Gestion de la mémoire : Stack vs Heap
static void Main(){
int i=3;
{
float temp = 23.0f;
temp /= i;
}
{
MyClass c = new MaClass();}
}
... 54 55 56 57 58 59 60 61 62 ...
... ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 23.0f23.0f23.0f23.0f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 7.6667f7.6667f7.6667f7.6667f ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 adresseadresseadresseadresse ...
... 54 55 56 57 58 59 60 61 62 ...
... 3333 ...
... 54 55 56 57 58 59 60 61 62 ...
... ...
Stack GC
12
lundi 5 septembre 2011
Bases du C#types
• Les types 2 : types valeurs et types références• Les types valeurs et les références aux types références sont
alloués sur la pile (Stack)• Les types références sont alloués sur le tas (Heap)• copie de types valeurs : les contenus sont copiés et
indépendants• copie de types références : les références sont copiées et
pointent donc sur le même espace mémoire sur le tas
13
lundi 5 septembre 2011
Bases du C#paramètres
• Les paramètres (cf. exemple 4)• passage par valeur• passage par référence• passage par référence de type valeur : ref, out• paramètres optionnels et nommés : optional and named• ref, out, optional and named• optional parameters to minimize method overloads (exemple 5)
• attention : il faut considérer le nom des paramètres comme faisant partie de la partie publique de l’API
• une fois qu’il y a eu une release de l’API, faire des overloads pour les paramètres par défaut rajouter dans les prochaines releases
14
lundi 5 septembre 2011
Bases du C#expressions, instructions et espace de noms
• Expressions et instructions : comme le C++• instructions logiques (if, else...) : cf. C++• instructions itératives (while, do-while, for) : cf. C++• + foreach (cf. exemple 6)• switch ++ (cf. exemple 7)
• Espace de noms : Namespaces + using (cf. exemple 8)
15
lundi 5 septembre 2011
création de types en C#classes : syntaxe, champs, constructeurs
• Classes : (champs, initialiseurs et constructeurs)• syntaxe, déclaration, utilisation (proche C++)• champs (proche C++)
➡ initialiseurs • de types valeur et de types référence
• constructeurs (proche C++)➡ this keyword
16
lundi 5 septembre 2011
création de types en C#classes : champs
• Classes : (champs, const, readonly)• champs 2
➡readonly vs const (≠ entre compile time et run time)• const (plus rapide mais inchangeable) quand la constante
est amenée à ne jamais être modifiée (quelle que soit la version du programme) : e.g. constantes de chaînes de caractères XML, enum, attribute parameters, ...
• readonly (plus lent mais peut être initialisée au démarrage) si la «variable» doit garder la même valeur tout au long du programme, mais dépend de l’initialisation
• dans le doute : readonly• attention aux types référence avec un readonly par exemple !
(cf. exemple 10)
17
lundi 5 septembre 2011
création de types en C#classes : champs, initialiseurs, constructeurs
• Classes : (champs, initialiseurs)• initialiseurs initialiseurs vs constructeurs
• ordre : initialiseurs PUIS constructeurs• code des initialiseurs «rajouté» par le compilateur avant
chaque constructeur (+ constructeur par défaut s’il n’existe pas)
• exécutés dans l’ordre de déclaration dans la classe• exécutés avant les constructeurs de la classe mère
18
lundi 5 septembre 2011
création de types en C#classes : champs, initialiseurs, constructeurs
• Classes : (champs, initialiseurs)• initialiseurs initialiseurs vs constructeurs
• règle générale : préférer l’utilisation d’initialiseurs• conseil 1 : éviter initialiseur + constructeur pour une variable
• si la valeur d’initialisation est toujours la même, préférer l’initialiseur
• si la valeur peut être différente dans au moins un constructeur, préférer les constructeurs et aucun initialiseur
• conseil 2 : éviter l’initialiseur pour initialiser à 0 ou null• conseil 3 : préférer le constructeur si on veut gérer les
exceptions de l’initialisation d’une variable
19
lundi 5 septembre 2011
création de types en C#classes : méthodes, propriétés, indexeurs
• Classes (méthodes, this, propriétés, indexeurs)• méthodes (proche C++)
• overloads• this (proche C++)• propriétés (cf. exemple 11)• indexeurs (cf. exemple 12)
20
lundi 5 septembre 2011
création de types en C#classes : static, partial
• Classes (static, partial)• static (proche C++) (exemple 13)
• membres, propriétés ou méthodes statiques : liés au type et non à une instance
• ordre : static initializers du type (dans l’ordre de déclaration), initializers des membres instances, static constructor (ctor par défaut, private), puis constructeurs des instances...
• static class : composée uniquement de membres, propriétés, méthodes (...) statiques
• pattern connu utilisant static : singleton• partial : permet de définir une classe sur plusieurs fichiers
(exemple 14)• finaliseurs
21
lundi 5 septembre 2011
création de types en C#classes : accesseurs et visibilité
• Accesseurs• public : visible par tous, ainsi qu’en dehors de l’assemblage• internal : visible par toutes les classes de l’assemblage (dll ou
exe) uniquementaccesseur par défaut des classes
• protected : visible par la classe et les classes filles• private : visible par la classe uniquement
accesseur par défaut des membres, propriétés et méthodes d’une classe
• protected internal
22
lundi 5 septembre 2011
création de types en C#Encapsulation : propriétés et visibilité
• Encapsulation• Propriétés
• s’utilisent comme des membres, mais ont la logique des méthodes (getter et setter) => ENCAPSULATION
• aussi rapides que les membres• très (très (très) ) utilisés dans le framework .NET, WPF,
SilverLight, WCF, ASP.NET, ...• plus évolutives que les membres (il me faut un test de plus...)• bien pour le multithread• peuvent être abstraites• accesseurs différents du setter et du getter
• visibilité des types : accesseurs
23
lundi 5 septembre 2011
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
24
lundi 5 septembre 2011
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
25
lundi 5 septembre 2011
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
26
lundi 5 septembre 2011
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)
27
lundi 5 septembre 2011
création de types en C#object type
• Type object (cf. exemple 21)• GetType, Equals, GetHashCode• ToString• conseil : essayer de toujours réécrire ToString dans les classes
publiques de l’API• boxing unboxing
28
lundi 5 septembre 2011
création de types en C#Structures
• Structures (cf. exemple 22)• value type • pas d’héritage (mais implémentation d’interfaces)• ne peuvent pas avoir de constructeur par défaut• ne peuvent pas avoir de finaliseurs• ne peuvent pas avoir de membres virtuels• pas d’initialiseurs pour les champs• pas de propriétés automatiques
• attention aux références => retour sur les types références
29
lundi 5 septembre 2011
Heap
Bases du C#Gestion de la mémoire : value type vs reference type (suite...)
struct Complex{
public int Real;public int Img;
public Complex(int a, int b){...}
}
static void Main(){
Complex c1 = new (1, -2);
Complex c2 = new (-3, 4);
c2 = c1;
c2.Real = 5; c2.Img = -6;}
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... ...
Stack
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... 1111 -2-2-2-2 ...
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... 1111 -2-2-2-2 -3-3-3-3 4444 ...
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... 1111 -2-2-2-2 1111 -2-2-2-2 ...
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... 1111 -2-2-2-2 5555 -6-6-6-6 ...
30
lundi 5 septembre 2011
Heap
Bases du C#Gestion de la mémoire : value type vs reference type (suite...)
class Complex{
public int Real;public int Img;
public Complex(int a, int b){...}
}
static void Main(){
Complex c1 = new (1, -2);
Complex c2 = new (-3, 4);
c2 = c1;
c2.Real = 5; c2.Img = -6;}
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... ...
Stack
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... adr. c1adr. c1adr. c1adr. c1 ...
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... adr. c1adr. c1adr. c1adr. c1 adr. c2adr. c2adr. c2adr. c2 ...
1
-2
-3
4
31
lundi 5 septembre 2011
Heap
Bases du C#Gestion de la mémoire : value type vs reference type (suite...)
class Complex{
public int Real;public int Img;
public Complex(int a, int b){...}
}
static void Main(){
Complex c1 = new (1, -2);
Complex c2 = new (-3, 4);
c2 = c1;
c2.Real = 5; c2.Img = -6;}
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... ...
Stack
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... adr. c1adr. c1adr. c1adr. c1 ...
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... adr. c1adr. c1adr. c1adr. c1 adr. c2adr. c2adr. c2adr. c2 ...
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... adr. c1adr. c1adr. c1adr. c1 adr. c2adr. c2adr. c2adr. c2 ...
1
-2
-3
4to beGC
32
lundi 5 septembre 2011
Heap
Bases du C#Gestion de la mémoire : value type vs reference type (suite...)
class Complex{
public int Real;public int Img;
public Complex(int a, int b){...}
}
static void Main(){
Complex c1 = new (1, -2);
Complex c2 = new (-3, 4);
c2 = c1;
c2.Real = 5; c2.Img = -6;}
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... ...
Stack
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... adr. c1adr. c1adr. c1adr. c1 ...
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... adr. c1adr. c1adr. c1adr. c1 adr. c2adr. c2adr. c2adr. c2 ...
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... adr. c1adr. c1adr. c1adr. c1 adr. c2adr. c2adr. c2adr. c2 ...
... 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ...
... adr. c1adr. c1adr. c1adr. c1 adr. c2adr. c2adr. c2adr. c2 ...
5
-6
-3
4to beGC
33
lundi 5 septembre 2011
création de types en C#Immuabilité et structures
• Immuabilité• différentes immuabilité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 immuables 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
34
lundi 5 septembre 2011
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
35
lundi 5 septembre 2011
création de types en C#Énumération/Types imbriqués
• Enum (cf. exemple 24)• Types imbriqués (Nested Types)
36
lundi 5 septembre 2011
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();
37
lundi 5 septembre 2011