C#8 et Visual Studio 2019
Les fondamentaux du langage
Avant-propos
Chapitre 1
La plateforme .NET
1. Introduction15
2. Historique de la plateforme17
3. Évolution de la plateforme25
3.1 .NET Standard25
3.2 .NET Compiler Platform : Roslyn26
3.3 .NET dans le monde open source27
4. Le Common Language Runtime (CLR)28
5. La Base Class Library (BCL)31
6. Le Dynamic Language Runtime (DLR)32
7. Une première application avec C#33
7.1 Création33
7.2 Compilation37
7.3 Analyse de l'assembly41
7.3.1 Structure41
7.3.2 Exploration avec ILDASM42
Chapitre 2
Visual Studio 2019
1. Installation et premier lancement47
1.1 Prérequis47
1.2 Éditions de Visual Studio48
1.2.1 Visual Studio Community48
1.2.2 Éditions commerciales49
1.3 Installation50
1.4 Premier lancement56
2. Description des outils64
2.1 Barres d'outils68
2.2 Explorateur de solutions70
2.3 Explorateur d'objets71
2.4 Explorateur de serveurs72
2.5 Fenêtre de propriétés76
2.6 Fenêtre d'édition de code79
2.6.1 Navigation79
2.6.2 Suivi des modifications79
2.6.3 Mise en surbrillance des références80
2.6.4 Refactorisation81
2.6.5 IntelliSense83
2.6.6 Snippets83
Chapitre 3
L'organisation d'une application
1. Les solutions85
1.1 Présentation85
1.2 Création d'une solution86
1.3 Organisation87
1.4 Actions disponibles sur une solution88
1.4.1 Ajout et suppression d'un projet88
1.4.2 Création d'un dossier de solution89
1.4.3 Chargement et déchargement d'un projet90
1.4.4 Création d'un fichier91
1.4.5 Génération de la solution91
1.5 Configuration de la solution92
1.5.1 Configuration des projets de démarrage92
1.5.2 Dépendances du projet94
1.5.3 Paramètres d'analyse du code95
1.5.4 Fichiers sources pour le débogage95
1.5.5 Configuration96
2. Les projets97
2.1 Création d'un projet97
2.2. Propriétés d'un projet103
2.2.1 Application103
2.2.2 Build105
2.2.3 Événements de build109
2.2.4 Package110
2.2.5 Déboguer111
2.2.6 Ressources113
2.2.7 Paramètres114
Chapitre 4
Les bases du langage
1. Introduction117
2. Les variables117
2.1 Nommage des variables118
2.2 Type des variables119
2.2.1 Types valeurs et types références119
2.2.2 Types intégrés120
2.3 Déclaration des variables124
2.4 Portée des variables125
2.5 Modificateurs d'accès126
2.6 Le mot-clé var et l'inférence de type126
3. Les constantes128
4. Les opérateurs128
4.1 Les opérateurs d'accès129
4.1.1 Accès simple129
4.1.2 Accès indexé : []129
4.1.3 Accès avec nullité conditionnelle ?130
4.2 Les opérateurs arithmétiques131
4.3 Les opérateurs de comparaison131
4.4 Les opérateurs conditionnels132
4.4.1 Opérateur ternaire : ?132
4.4.2 Opérateur de fusion de valeur nulle : ??133
4.5 Les opérateurs logiques133
4.5.1 Négation : !133
4.5.2 Et logique : &134
4.5.3 Ou logique : |134
4.5.4 Ou exclusif : ^134
4.5.5 Et conditionnel : &&135
4.5.6 Ou conditionnel : ||135
4.6 Les opérateurs binaires136
4.6.1 Et binaire : &136
4.6.2 Ou binaire : |136
4.6.3 Ou exclusif : ^137
4.6.4 Négation : (...)137
4.6.5 Décalage vers la droite : >>137
4.6.6 Décalage vers la gauche : <<138
5. Les structures de contrôle138
5.1 Les structures conditionnelles138
5.1.1 if... else138
5.1.2 switch140
5.1.3 Le pattern matching141
5.2 Les structures d'itération146
5.2.1 for146
5.2.2 While147
5.2.3 do... while147
5.2.4 foreach147
5.2.5 Contrôler l'exécution d'une boucle148
5.3 Autres structures149
5.3.1 using149
5.3.2 goto150
6. Les fonctions151
6.1 Écriture d'une fonction151
6.2 Paramètres de fonction153
6.3 Procédures158
6.4 Surcharges158
6.5 Fonctions locales160
7. Les tuples161
8. Les attributs164
Chapitre 5
La programmation orientée objet avec C#
1. Les principes de la programmation orientée objet165
2. Les classes et les structures168
2.1 Classes168
2.1.1 Déclaration169
2.1.2 Constructeur et destructeur171
2.1.3 Classes partielles175
2.2 Structures176
2.3 Création de méthodes177
2.3.1 Création177
2.3.2 Méthodes partielles179
2.3.3 Méthodes d'extension180
2.3.4 Méthodes opérateurs182
2.4 Création de propriétés184
2.4.1 Lecture et écriture184
2.4.2 Lecture seule185
2.4.3 Écriture seule186
2.4.4 Propriétés automatiques186
2.4.5 Initialisation de propriétés automatiques187
2.4.6 Propriétés automatiques en lecture seule188
2.4.7 Propriétés indexées188
2.5 Membres statiques189
2.6 Utilisation des classes et structures190
2.6.1 Instanciation190
2.6.2 Initialisation191
2.6.3 Types anonymes192
3. Les espaces de noms195
3.1 Nomenclature195
3.2 Using196
4. L'héritage198
4.1 Mise en oeuvre198
4.2 Les mots-clés this et base199
4.3 Redéfinition et masquage200
4.3.1 Redéfinition de méthode201
4.3.2 Masquage de méthode202
4.3.3 Différences entre redéfinition et masquage202
4.4 Imposer ou interdire l'héritage205
4.5 Le transtypage206
5. Les interfaces208
5.1 Création209
5.2 Utilisation211
5.2.1 Implémentation implicite212
5.2.2 Implémentation explicite214
6. Les énumérations216
7. Les délégués216
7.1 Création217
7.2 Utilisation217
7.3 Expressions lambda218
8. Les événements219
8.1 Déclaration et déclenchement219
8.2 Gestion des événements221
9. Les génériques222
9.1 Classes223
9.1.1 Définition d'une classe générique223
9.1.2 Utilisation d'une classe générique224
9.2 Interfaces224
9.2.1 Définition d'une interface générique225
9.2.2 Utilisation d'une interface générique226
9.3 Contraintes227
9.4 Méthodes232
9.4.1 Définition d'une méthode générique232
9.4.2 Utilisation d'une méthode générique234
9.5 Événements et délégués234
10. Les collections236
10.1 Types existants236
10.1.1Array237
10.1.2ArrayList et List <T>237
10.1.3Hashtable et Dictionary <TKey, TValue>241
10.1.4Stack et Stack <T>244
10.1.5Queue et Queue <T>244
10.2 Choisir un type de collection245
11. La programmation dynamique245
12. La programmation asynchrone248
12.1 Les objets Task248
12.2 Écrire du code asynchrone avec async et await251
Chapitre 6
Le débogage et la gestion des erreurs
1. Les différents types d'erreurs253
1.1 Erreurs de compilation253
1.2 Erreurs d'exécution255
2. Utilisation des exceptions256
2.1 Création et déclenchement d'exceptions256
2.1.1 La classe Exception256
2.1.2 Le mot-clé throw257
2.1.3 Exceptions spécialisées257
2.2 Gérer les exceptions258
2.2.1 La structure try... catch258
2.2.2 Les filtres d'exception261
2.2.3 Le bloc finally262
3. Les outils fournis par Visual Studio264
3.1 Contrôle de l'exécution264
3.1.1 Démarrage265
3.1.2 Arrêt266
3.1.3 Pause266
3.1.4 Reprise267
3.2 Points d'arrêt267
3.3 Visualiser le contenu des variables274
3.3.1 Data Tips274
3.3.2 Fenêtres Espion275
3.3.3 Fenêtre Espion express276
3.3.4 Fenêtre Automatique277
3.3.5 Fenêtre Variables locales277
3.4 Compilation conditionnelle277
4. L'erreur à un milliard de dollars : les références nulles280
4.1 NullReferenceException281
4.2 Une solution : l'utilisation de types références non-nuls283
Chapitre 7
Le développement d'applications Windows
1. Présentation de WPF289
1.1 Structure d'une application WPF290
1.2 XAML291
1.2.1 Templates292
1.2.2 Espaces de noms293
1.3 Contexte de données et binding294
2. Utilisation des contrôles298
2.1 Ajout de contrôles299
2.2 Positionnement et dimensionnement des contrôles302
2.3 Ajout d'un gestionnaire d'événements à un contrôle305
3. Les principaux contrôles307
3.1 Contrôles de fenêtrage308
3.1.1 Window308
3.1.2 NavigationWindow311
3.2 Contrôles de disposition313
3.2.1 Grid313
3.2.2 StackPanel316
3.2.3 DockPanel317
3.2.4 WrapPanel319
3.2.5 Canvas320
3.3 Contrôles d'affichage de données321
3.3.1 TextBlock321
3.3.2 Label322
3.3.3 Image324
3.3.4 ScrollViewer325
3.3.5 ItemsControl325
3.3.6 StatusBar329
3.3.7 ToolTip329
3.4 Contrôles d'édition de texte330
3.4.1 TextBox330
3.4.2 RichTextBox331
3.4.3 PasswordBox333
3.5 Contrôles de sélection334
3.5.1 RadioButton334
3.5.2 CheckBox334
3.5.3 ComboBox335
3.5.4 ListBox336
3.5.5 ListView337
3.5.6 TreeView340
3.5.7 Slider345
3.5.8 Calendar345
3.5.9 DatePicker346
3.6 Contrôles d'action346
3.6.1 Button347
3.6.2 Menu347
3.6.3 ContextMenu350
3.6.4 ToolBar350
4. Interactions clavier et souris352
4.1 Événements clavier352
4.2 Événements souris355
4.3 Glisser-déposer357
5. Aller plus loin avec WPF360
5.1 Introduction à l'utilisation de Blend360
5.1.1 L'interface361
5.1.2 Ajout et modification de contrôles visuels368
5.2 Introduction à MVVM371
5.2.1 Présentation371
5.2.2 Les interfaces INotifyPropertyChanged et INotifyCollectionChanged372
5.2.3 Commandes373
5.2.4 Mise en oeuvre373
Chapitre 8
L'accès aux données
1. Principes d'une base de données389
1.1 Terminologie389
1.2 Le langage SQL390
1.2.1 Recherche d'enregistrements391
1.2.2 Ajout d'enregistrements393
1.2.3 Mise à jour d'informations393
1.2.4 Suppressions d'informations394
2. ADO.NET394
2.1 Présentation394
2.2 Les fournisseurs de données395
2.2.1 SQL Server396
2.2.2 OLE DB396
2.2.3 ODBC397
3. Utiliser ADO.NET en mode connecté397
3.1 Connexion à une base de données398
3.1.1 Chaînes de connexion398
3.1.2 Pools de connexions401
3.1.3 Gestion de la connexion403
3.2 Création et exécution de commandes405
3.2.1 Définition et création d'une commande406
3.2.2 Sélection de données406
3.2.3 Actions sur les données408
3.2.4 Paramétrage d'une commande408
3.2.5 Exécution de procédures stockées411
4. Utiliser ADO.NET en mode déconnecté413
4.1 DataSet et Data Table413
4.1.1 Description413
4.1.2 Remplissage d'un DataSet à partir d'une base de données414
4.1.3 Remplissage d'un DataSet sans base de données417
4.2 Manipulation des données hors connexion420
4.2.1 Lecture des données421
4.2.2 Création de contraintes421
4.2.3 Relations entre Data Tables425
4.2.4 État et versions d'une DataRow427
4.2.5 Modification de données428
4.2.6 Suppression de données430
4.2.7 Valider ou annuler des modifications430
4.2.8 Filtrage et tri à l'aide d'une DataView431
4.2.9 Recherche de données434
4.3 Valider les modifications au niveau de la base de données436
4.3.1 Générer des commandes de mise à jour automatiquement437
4.3.2 Commandes de mise à jour personnalisées439
4.3.3 Gestion des accès concurrentiels440
5. Utiliser les transactions442
Chapitre 9
LINQ
1. Présentation de LINQ445
2. Syntaxe446
2.1 Une première requête LINQ449
2.2 Les opérateurs de requête452
2.2.1 Projection452
2.2.2 Filtrage454
2.2.3 Triage456
2.2.4 Partitionnement457
2.2.5 Jointure et regroupement458
2.2.6 Agrégation461
3. Entity Framework Core463
3.1 Les principes du mappage objet-relationnel463
3.1.1 Les principes463
3.2 Mise en place465
3.2.1 Génération du code à partir d'une base de données467
3.2.2 Création d'une base de données avec du code481
3.3 Utilisation de LINQ avec Entity Framework Core483
3.3.1 Récupération de données484
3.3.2 Mise à jour de données486
3.3.3 Gestion des conflits488
Chapitre 10
XML
1. Présentation493
2. Structure d'un fichier XML494
2.1 Constituants d'un document XML494
2.2 Document bien formé et document valide498
3. Manipuler un document XML499
3.1 Utilisation de DOM500
3.2 Utilisation de XPath505
3.3 Utilisation de LINQ to XML508
Chapitre 11
Le déploiement
1. Introduction513
2. Windows Installer514
2.1 Création d'un projet d'installation515
2.1.1 Opérations sur le système de fichiers517
2.1.2 Opérations sur le registre de la machine cible521
2.1.3 Configuration de l'installation par l'utilisateur522
2.1.4 Exécution d'actions personnalisées524
2.1.5 Conditions525
3. Fichiers binaires (.exe, .dll)527
4. ClickOnce533
4.1 La technologie ClickOnce533
4.1.1 Principes de fonctionnement534
4.1.2 Méthodes de déploiement disponibles535
4.1.3 Les mises à jour d'applications avec ClickOnce536
4.2 La publication ClickOnce538
5. MSIX547
Chapitre 12
Aide-mémoire
1. Introduction563
Index583