Visual Studio 2019: Développez Des Applications Windows
Visual Studio 2019: Développez Des Applications Windows
Visual Studio 2019: Développez Des Applications Windows
C# 8
Ce livre sur le développement d’applications Windows avec le langage C# (en Jérôme HUGON est développeur/
version 8) et Visual Studio 2019 est destiné aux développeurs qui débutent consultant .NET depuis de nombreuses
avec le framework .NET. Il leur permet d’apprendre les bases du langage années et est certifié Microsoft sur les
C# et introduit des concepts plus avancés leur donnant une vue d’ensemble technologies .NET. Son expérience du
2019
des possibilités offertes par le langage C#, Visual Studio et le framework .NET développement de sites web ASP.NET et
en général. L’auteur a choisi une approche pas à pas tout en construisant une SharePoint comme d’applications Win-
application fonctionnelle tout au long de l’ouvrage pour illustrer de manière dows ou Microsoft Surface lui permet
pratique et cohérente les concepts abordés. d’apporter au lecteur une connaissance
L’apprentissage commence par la familiarisation avec l’interface de Visual de base solide du langage C# mais aussi
Studio 2019 ainsi qu’avec le concept de l’architecture .NET. Les détails du une belle ouverture vers des concepts
Développez
de la création de formulaires à la création de contrôles en passant par l’im-
plémentation de gestionnaire d’évènements et la validation des données sai-
Téléchargement
sies. Une introduction à la conception d’application WPF est également incluse. www.editions-eni.fr
.fr
Les outils de Visual Studio qui permettent de réaliser les tests et le débo-
C# 8
Pour plus
l’utilisation des expressions régulières, le développement d’applications
d’informations : des exemples de code
multitâches et asynchrones, la globalisation et la localisation d’une appli- Version en ligne
cation, la sécurité du code, l’implémentation d’applications client/serveur, le
dessin avec GDI+ ainsi que la réflexion font partie des sujets introduits.
La dernière partie de l’ouvrage est consacrée à la création d’assemblages + QUIZ OFFERTE !
ainsi qu’au déploiement des applications. Les outils et techniques mis à dis- pendant 1 an
ISBN : 978-2-409-02004-9
position par Visual Studio pour créer des installeurs Windows et configurer
les applications y sont détaillés.
Le code de l’application exemple traitée dans l’ouvrage est en téléchargement
sur le site www.editions-eni.fr. 39 € Jérôme HUGON
Table des matières 1
Avant-propos
Chapitre 1
Travailler avec Visual Studio 2019
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2. L'interface de développement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.1 L'éditeur de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2 Le concepteur de vues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.3 Le débogueur intégré . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.4 Le gestionnaire d'extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.5 NuGet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.6 Fenêtres personnalisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3. La création de solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.1 Définir le point d'entrée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2 La différence entre projets et solutions . . . . . . . . . . . . . . . . . . . . 33
3.3 Configurer le projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.4 La conversion de solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.5 Les projets partagés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.6 Les outils de refactorisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Chapitre 2
L'architecture .NET
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2. CLR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3. Les bibliothèques de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2 C# 8
Développez des applications Windows avec Visual Studio 2019
4. Les types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1 Les types valeur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.2 Les types référence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Chapitre 3
Introduction au langage C#
1. La syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
1.1 Les identifiants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
1.2 Les mots-clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
1.3 La ponctuation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
1.4 Les opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
1.4.1 Les opérateurs de calcul. . . . . . . . . . . . . . . . . . . . . . . . . . . 52
1.4.2 Les opérateurs d'assignation . . . . . . . . . . . . . . . . . . . . . . . 53
1.4.3 Les opérateurs de comparaison . . . . . . . . . . . . . . . . . . . . . 53
1.5 La déclaration de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
1.6 Les instructions de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
1.6.1 Les instructions conditionnelles . . . . . . . . . . . . . . . . . . . . 55
1.6.2 Les instructions itératives . . . . . . . . . . . . . . . . . . . . . . . . . 60
1.6.3 Les instructions de saut. . . . . . . . . . . . . . . . . . . . . . . . . . . 62
1.7 Les commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
2. Les espaces de noms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
2.1 Le mot-clé using . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
2.2 Le mot-clé alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
2.3 Les classes statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3. Les types de base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.1 Les types numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.1.1 Les entiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.1.2 Les décimaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.2 Les booléens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.3 Les chaînes de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.4 Les types nullable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Table des matières 3
Chapitre 4
La création de types
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
2. Les niveaux d'accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3. Les structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4. Les classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.1 Les champs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.2 Les propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4.3 Les méthodes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
4.3.1 La surcharge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.3.2 Les paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.3.3 Les tuples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.4 Les constructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.5 Les destructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
4.6 Les classes et membres statiques . . . . . . . . . . . . . . . . . . . . . . . . 104
4.7 Les classes partielles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
4.8 Le mot-clé this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
4.9 Les indexeurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
4.10 La surcharge d'opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
4.10.1 Les opérateurs arithmétiques . . . . . . . . . . . . . . . . . . . . . 110
4.10.2 Les opérateurs de comparaison . . . . . . . . . . . . . . . . . . . . 112
4 C# 8
Développez des applications Windows avec Visual Studio 2019
Chapitre 5
L'héritage
1. L'héritage de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
1.1 Implémenter l'héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
1.2 Les membres virtuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
1.3 Masquer les membres hérités. . . . . . . . . . . . . . . . . . . . . . . . . . . 117
1.4 Le mot-clé base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
1.5 Les classes et membres abstraits . . . . . . . . . . . . . . . . . . . . . . . . 119
1.6 Les classes et les méthodes scellées . . . . . . . . . . . . . . . . . . . . . . 120
1.7 Les constructeurs dérivés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
1.8 Le polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
2. Les interfaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
2.1 L'implémentation d'interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . 125
2.2 Le polymorphisme d'interface . . . . . . . . . . . . . . . . . . . . . . . . . . 127
2.3 L'héritage d'interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Chapitre 6
Types génériques
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
2. La création de types génériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
3. Les contraintes de type. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
4. Les interfaces génériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
4.1 La variance dans les interfaces génériques . . . . . . . . . . . . . . . . 136
4.1.1 La covariance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
4.1.2 La contravariance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
4.2 La création d'interfaces génériques variantes . . . . . . . . . . . . . . 138
4.3 L'héritage d'interfaces génériques variantes . . . . . . . . . . . . . . . 139
5. La création de méthodes génériques . . . . . . . . . . . . . . . . . . . . . . . . . 140
6. Valeur par défaut générique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
7. L'héritage de classe générique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Table des matières 5
Chapitre 7
Délégués, événements et expressions lambda
1. Les délégués . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
1.1 Les paramètres de méthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
1.2 Les méthodes cibles multiples . . . . . . . . . . . . . . . . . . . . . . . . . . 147
1.3 Les délégués génériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
1.4 La compatibilité des délégués. . . . . . . . . . . . . . . . . . . . . . . . . . . 148
2. Les événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
3. Les expressions lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
3.1 L'utilisation des expressions lambda . . . . . . . . . . . . . . . . . . . . . 154
3.2 Les délégués génériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
3.3 La capture de variable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
3.4 Les fonctions locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Chapitre 8
Création de formulaires
1. Utiliser les formulaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
1.1 Ajouter des formulaires au projet . . . . . . . . . . . . . . . . . . . . . . . 159
1.2 Modifier le formulaire de démarrage . . . . . . . . . . . . . . . . . . . . . 162
1.3 Les propriétés des formulaires . . . . . . . . . . . . . . . . . . . . . . . . . . 162
1.4 Les méthodes des formulaires . . . . . . . . . . . . . . . . . . . . . . . . . . 165
1.5 Les événements des formulaires . . . . . . . . . . . . . . . . . . . . . . . . 166
2. Utiliser les contrôles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
2.1 Les types de contrôles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
2.2 Ajouter des contrôles aux formulaires. . . . . . . . . . . . . . . . . . . . 168
2.3 Les propriétés des contrôles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
2.4 Les menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
2.5 Les conteneurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
2.6 L'ergonomie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
2.7 Ajouter des contrôles à la boîte à outils . . . . . . . . . . . . . . . . . . 176
6 C# 8
Développez des applications Windows avec Visual Studio 2019
Chapitre 9
Implémentation de gestionnaires d’événements
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
2. La création de gestionnaires d'événements . . . . . . . . . . . . . . . . . . . . 180
2.1 La mécanique d'un événement. . . . . . . . . . . . . . . . . . . . . . . . . . 181
2.2 L'ajout dynamique d'un gestionnaire d'événements . . . . . . . . 182
2.3 La suppression dynamique d'un gestionnaire d'événements . . 183
3. Les gestionnaires d'événements avancés . . . . . . . . . . . . . . . . . . . . . . 183
3.1 Un gestionnaire pour plusieurs événements. . . . . . . . . . . . . . . 183
3.2 Plusieurs gestionnaires pour un événement . . . . . . . . . . . . . . . 184
Chapitre 10
Validation de la saisie
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
2. La validation au niveau des champs . . . . . . . . . . . . . . . . . . . . . . . . . 187
2.1 Les propriétés de validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
2.2 Les événements de validation . . . . . . . . . . . . . . . . . . . . . . . . . . 188
2.2.1 KeyDown et KeyUp . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
2.2.2 KeyPress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
2.2.3 Validating et Validated . . . . . . . . . . . . . . . . . . . . . . . . . . 189
3. La validation au niveau du formulaire . . . . . . . . . . . . . . . . . . . . . . . 191
4. Les méthodes de retour à l'utilisateur . . . . . . . . . . . . . . . . . . . . . . . . 194
4.1 MessageBox. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
4.2 ErrorProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Chapitre 11
Création de contrôles utilisateurs
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
2. Les contrôles personnalisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
3. L'héritage de contrôles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Table des matières 7
Chapitre 12
Création d'applications UWP
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
2. Principes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
3. Les outils de développement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
4. Le langage XAML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
5. Une première application UWP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
5.1 Les bases d’un projet UWP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
5.2 Les contrôles et événements . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
5.3 Les styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Chapitre 13
Débogage
1. Les types d'erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
1.1 Les erreurs de syntaxe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
1.2 Les erreurs d'exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
1.3 Les erreurs de logique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
2. Le débogueur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
2.1 Contrôler l'exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
2.2 Les points d'arrêt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
2.2.1 Les conditions d'arrêt. . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
2.2.2 Le nombre d'accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
2.2.3 Le filtrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
2.2.4 Les actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
2.2.5 Exécuter l’exécution jusqu’ici . . . . . . . . . . . . . . . . . . . . . 237
2.3 Les DataTips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
2.4 Les PerfTips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
2.5 Les attributs Caller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
8 C# 8
Développez des applications Windows avec Visual Studio 2019
Chapitre 14
Gestion des exceptions
1. La classe Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
2. La création d'exceptions personnalisées . . . . . . . . . . . . . . . . . . . . . . 248
3. Le déclenchement des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
4. L'interception et la gestion des exceptions . . . . . . . . . . . . . . . . . . . . 252
Chapitre 15
Monitoring
1. Le traçage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
1.1 Les classes Debug et Trace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
1.2 La collection d'écouteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
1.2.1 La création d'écouteurs . . . . . . . . . . . . . . . . . . . . . . . . . . 262
1.2.2 La sauvegarde des traces . . . . . . . . . . . . . . . . . . . . . . . . . 263
1.3 Les commutateurs de trace . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
1.3.1 Le fonctionnement des commutateurs de trace . . . . . . 265
1.3.2 La configuration des commutateurs de trace . . . . . . . . 266
2. Les journaux d'événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
2.1 L'interaction avec les journaux d'événements . . . . . . . . . . . . . 268
2.2 La gestion des journaux d'événements . . . . . . . . . . . . . . . . . . . 269
2.3 L'écriture d'événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Table des matières 9
Chapitre 16
Tests unitaires
1. Introduction aux tests unitaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
1.1 La création du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
1.2 Les classes de tests unitaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
2. La mise en place d'une série de tests . . . . . . . . . . . . . . . . . . . . . . . . . 284
2.1 La création de tests au projet . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
2.2 Le déroulement des tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Chapitre 17
Création du modèle de données
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
2. La création d'un modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
3. La création d'entités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
4. La génération de la base de données . . . . . . . . . . . . . . . . . . . . . . . . . 297
5. La création d'entités à partir du code (Code First) . . . . . . . . . . . . . . 302
Chapitre 18
Présentation d’Entity Framework
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
2. Le mappage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
2.1 La couche logique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
2.2 La couche conceptuelle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
10 C# 8
Développez des applications Windows avec Visual Studio 2019
Chapitre 19
Présentation de LINQ
1. Les requêtes LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
1.1 La syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
1.2 Les méthodes d'extension. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
2. Les opérateurs de requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
2.1 Filtrer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
2.1.1 Where . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
2.1.2 OfType<TResult> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
2.1.3 SelectMany . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
2.1.4 Skip et Take . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
2.2 Ordonner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
2.2.1 OrderBy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
2.2.2 ThenBy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
2.3 Grouper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
2.3.1 GroupBy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
2.3.2 Join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
2.4 Agréger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
2.5 Convertir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
3. Les requêtes parallèles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
3.1 Partitionner une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
3.2 Annuler une requête. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Table des matières 11
Chapitre 20
LINQ to Entities
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
2. Extraire les données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
2.1 L'extraction simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
2.2 L'extraction conditionnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
3. Ajouter, modifier et supprimer des données . . . . . . . . . . . . . . . . . . . 336
3.1 Ajouter des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
3.2 Modifier des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
3.3 Supprimer des données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
3.4 L'envoi des modifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Chapitre 21
LINQ to SQL
1. La création de classes LINQ to SQL . . . . . . . . . . . . . . . . . . . . . . . . . 339
2. L'objet DataContext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
2.1 La méthode ExecuteQuery. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
2.2 Utiliser des transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
2.3 Les autres membres de DataContext . . . . . . . . . . . . . . . . . . . . 344
3. Exécuter des requêtes avec LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
3.1 Les requêtes simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
3.2 Les requêtes filtrées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
3.3 Les requêtes de jointure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
4. Les procédures stockées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
4.1 L'ajout de procédures stockées au modèle. . . . . . . . . . . . . . . . . 347
4.2 L'exécution de procédures stockées . . . . . . . . . . . . . . . . . . . . . . 348
12 C# 8
Développez des applications Windows avec Visual Studio 2019
Chapitre 22
LINQ to XML
1. Les objets XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
1.1 XDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
1.2 XElement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
1.3 XNamespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
1.4 XAttribute. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
1.5 XComment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
2. Exécuter des requêtes avec LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
2.1 Les requêtes simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
2.2 Les requêtes filtrées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
2.3 Les requêtes de jointure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Chapitre 23
Le système de fichiers
1. Les classes de gestion du système de fichiers . . . . . . . . . . . . . . . . . . 355
1.1 DriveInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
1.2 Directory et DirectoryInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
1.3 File et FileInfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
1.4 Path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
2. Travailler avec le système de fichiers . . . . . . . . . . . . . . . . . . . . . . . . 365
2.1 Les objets Stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
2.2 La classe FileStream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
2.3 Lire un fichier texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
2.3.1 Lire avec la classe File . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
2.3.2 Lire avec la classe StreamReader. . . . . . . . . . . . . . . . . . . 368
2.4 Écrire dans un fichier texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
2.4.1 Écrire avec la classe File . . . . . . . . . . . . . . . . . . . . . . . . . . 370
2.4.2 Écrire avec la classe StreamWriter . . . . . . . . . . . . . . . . . 371
Table des matières 13
Chapitre 24
Sérialisation
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
2. La sérialisation binaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
2.1 Les bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
2.2 Contrôler la sérialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
2.2.1 Le contrôle par attribut . . . . . . . . . . . . . . . . . . . . . . . . . . 376
2.2.2 Le contrôle par interface . . . . . . . . . . . . . . . . . . . . . . . . . 378
3. La sérialisation XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
3.1 Les bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
3.2 Contrôler la sérialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
3.3 La sérialisation XML SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Chapitre 25
Expressions régulières
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
2. Une première expression régulière. . . . . . . . . . . . . . . . . . . . . . . . . . . 390
3. Les options de recherche. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
4. Les caractères d'échappement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
5. Les ensembles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
6. Les groupes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
7. Les ancres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
8. Les quantifieurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Chapitre 26
Multithreading
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
2. La classe Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
2.1 Créer un thread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
2.2 Suspendre ou annuler un thread . . . . . . . . . . . . . . . . . . . . . . . . 399
14 C# 8
Développez des applications Windows avec Visual Studio 2019
Chapitre 27
Globalisation et localisation
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
2. La culture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
3. La globalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
4. La localisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
Chapitre 28
Sécurité
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
2. Les éléments de base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
2.1 L'interface IPermission . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
2.2 La classe CodeAccessPermission . . . . . . . . . . . . . . . . . . . . . . . . 422
2.3 L'interface IPrincipal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
3. Implémentation de la sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
3.1 La sécurité basée sur les rôles . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
3.1.1 Sécurité impérative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
3.1.2 Sécurité déclarative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
3.2 La sécurité basée sur les droits d'accès. . . . . . . . . . . . . . . . . . . . 427
3.2.1 Sécurité impérative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
3.2.2 Sécurité déclarative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
4. Introduction à la cryptographie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Table des matières 15
Chapitre 29
Pour aller plus loin
1. Le dessin avec GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
1.1 La classe Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
1.1.1 Les coordonnées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
1.1.2 Les formes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
1.2 La structure Color et les classes Brush et Pen . . . . . . . . . . . . . . 437
1.2.1 La structure Color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
1.2.2 La classe Brush . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
1.2.3 La classe Pen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
1.2.4 Les paramètres système. . . . . . . . . . . . . . . . . . . . . . . . . . 439
1.3 Les exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
1.3.1 L'affichage de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
1.3.2 Redimensionner une image. . . . . . . . . . . . . . . . . . . . . . . 441
2. Le remoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
2.1 Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
2.2 L'implémentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
2.2.1 La couche commune . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
2.2.2 L'application serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
2.2.3 L'application cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
3. Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
3.1 La classe System.Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
3.2 Charger un assemblage dynamiquement . . . . . . . . . . . . . . . . . 452
3.2.1 L'énumération des types . . . . . . . . . . . . . . . . . . . . . . . . . 452
3.2.2 L'instanciation d'objets . . . . . . . . . . . . . . . . . . . . . . . . . . 453
3.2.3 L'utilisation des membres . . . . . . . . . . . . . . . . . . . . . . . . 454
16 C# 8
Développez des applications Windows avec Visual Studio 2019
Chapitre 30
Assemblages et configurations
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
2. Les assemblages privés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
3. Les assemblages partagés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
4. Les fichiers de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Chapitre 31
Déploiement
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
2. Les projets de déploiement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
2.1 XCOPY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
2.2 Projet CAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
2.3 Projet de module de fusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
2.4 Projet d'installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
3. L'assistant Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
4. Configuration du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
4.1 Les propriétés du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
4.2 Les éditeurs de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
4.2.1 Éditeur du système de fichiers . . . . . . . . . . . . . . . . . . . . 477
4.2.2 Éditeur du registre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
4.2.3 Éditeur des types de fichiers . . . . . . . . . . . . . . . . . . . . . . 479
4.2.4 Éditeur de l'interface utilisateur . . . . . . . . . . . . . . . . . . . 481
4.2.5 Éditeur des actions personnalisées . . . . . . . . . . . . . . . . . 483
4.2.6 Éditeur des conditions de lancement . . . . . . . . . . . . . . . 484
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
199
Chapitre 11
Création de contrôles utilisateurs
1. Introduction
Création de contrôles utilisateurs
namespace SelfMailer.Controls
{
public class CustomControl : System.Windows.Forms.Control
{
protected override void OnPaint
(System.Windows.Forms.PaintEventArgs e)
{
Rectangle R = new Rectangle(0, 0,
this.Size.Width, this.Size.Height);
e.Graphics.FillRectangle(Brushes.Green, R);
}
}
}
Remarque
Les possibilités de dessin avec GDI+ seront abordées plus loin dans cet
ouvrage, à la section Le dessin avec GDI+ du chapitre Pour aller plus loin.
Il suffit ensuite d'ajouter les membres requis pour la logique du contrôle afin
de le finaliser.
202 C# 8
Développez des applications Windows avec Visual Studio 2019
3. L'héritage de contrôles
Si le but est d'étendre les fonctionnalités d'un contrôle existant, que ce soit un
contrôle du Framework .NET ou d'un éditeur tiers, la manière la plus rapide
est d'hériter de ce contrôle. Le nouveau contrôle possède ainsi tous les
membres et la représentation visuelle de sa classe parente. Il n'y a plus qu'à
rajouter la logique de traitement. Au même titre que les contrôles personnali-
sés, il reste possible de surcharger la méthode OnPaint pour modifier l'aspect
visuel du contrôle.
Si une application comporte plusieurs formulaires qui requièrent un e-mail
comme champ de saisie, il serait préférable de créer un contrôle héritant de la
classe TextBox et d'y implémenter la logique de validation puis d'ajouter ce
contrôle aux formulaires de manière à ne pas répéter le code de validation dans
chacun d'eux.
La création d'un contrôle hérité se fait de la même manière qu'un contrôle per-
sonnalisé, en créant une classe qui va hériter du contrôle ayant le comporte-
ment de base souhaité. Créez la classe EmailTextBox dans le dossier
Controls et faites-la hériter de la classe TextBox :
public class EmailTextBox : System.Windows.Forms.TextBox
{
}
}
else
this.BackColor = this.PreviousBackColor;
}
La première instruction :
base.OnValidating(e);
public EmailTextBox()
{
this.PreviousBackColor = this.BackColor;
}