Andrew Stellman & Jennifer Greene
Andrew Stellman & Jennifer Greene
C#
Andrew Stellman & Jennifer Greene
Traduction de Sophie Govaere
Un guide d’apprentissage
Tête la premièreUn guide de programmation
à C# et .Net qui garde les pieds sur terre
Dominez vos données avec LINQ
Construisez un jeu d’arcane rétro
et complet
Apprenez comment Suzanne a tordu les lois en vigueur à Objectville grâce aux méthodes d’extension
Découvrez les secrets de
l’abstraction et de l’héritage
Voyez comment Paul a manipulé ses données à l’aide des collections
génériques
Un guide d’apprentissage
Tête la première
Couvre C# 3.0 et
Visual Studio 2008
Beijing • Cambridge • K�ln • Paris • Sebastopol • Taipei • Tokyo
Andrew StellmanJennifer Greene
Traduction de Sophie Govaere
C# Tête la première
Ne serait-ce pas merveilleux s’il existait un livre sur C#
qui serait plus excitant que de déboguer un code sans fin ? Mais ce
n’est probablement qu’un rêve…
C# — Tête la première
de Andrew Stellman et Jennifer Greene
© 2008 O’Reilly Media, Inc. Tous droits réservés.
© 2008 O’Reilly Tous droits réservés.
ISBN 10 : 2-35402-094-5 ISBN 13 : 978-2-35402-094-1
Conception : Kathy Sierra, Bert Bates
Responsable éditorial VO : Brett D. McLaughlin
Éditrice VF : Dominique Buraud
Design : Louise Barr
Couverture conçue par : Louise Barr, Steve Fehler
Production : Sanders Kleinfeld
Relecture VO : Colleen Gorman
Relecture VF : Guillaume Barthe & Aurélien Houee
Index : Julie Hawks
Les programmes fi gurant dans ce livre ont pour but d’illustrer les sujets traités. Il n’est donné aucune garantie quant à leur fonctionnement une fois compilés, assemblés ou in terprétés dans le cadre d’une utilisation professionnelle ou commerciale.
Toute représentation ou reproduction, intégrale ou partielle, faite sans le consentement de l’auteur, de ses ayants droit, ou ayants cause, est illicite (loi du 11 mars 1957, alinéa 1er de l’article 40). Cette représen tation ou reproduction, par quelque procédé que ce soit, constituerait une contrefaçon sanctionnée par les articles 425 et suivants du Code pénal. La loi du 11 mars 1957 autorise uniquement, aux termes des alinéas 2 et 3 de l’article 41, les copies ou reproductions strictement réservées à l’usage privé du copiste et non destinées à une utilisation collective d’une part et, d’autre part, les analyses et les courtes citations dans un but d’exemple et d’illustration.
Microsoft, Windows, Visual Studio, MSDN, le logo .NET, Visual Basic et Visual C# sont des marques déposées de Microsoft Corporation.
Aucune abeille, extra-terrestre ou héros de bande dessinées n’ont été maltraités pendant la réalisation de ce livre.
En mémoire de Sludgie la baleine, qui a nagé jusqu’à Brooklyn le 17 avril 2007.
Tu n’étais dans nos canaux que pour un jour, mais tu restes dans nos cœurs pour toujours.
viii
Jennifer Greene a étudié la philosophie à l’université mais, comme tout le monde dans cette branche, elle n’a pas pu trouver de travail dans son domaine. Heureusement, elle est douée pour tester des logiciels, elle a donc commencé à le faire pour un service en ligne, ce qui lui a donné un premier bon aperçu de ce qu’est la gestion de projets.
Elle a déménagé à New-York en 1998 pour tester des logiciels dans une entreprise de logiciels de fi nance. Elle dirigeait une équipe de testeurs dans une start-up très sympa qui s’occupait d’intelligence artifi cielle et du traitement des langages naturels.
Depuis, elle a parcouru le monde pour travailler avec différentes équipes et créer toutes sortes de projets logiciels intéressants.
Elle aime voyager, regarder des fi lms de Bollywood, lire une BD à l’occasion, attendre que sa Xbox soit réparée, boire des tonnes de sodas et possède un lévrier whippet.
Andrew Stellman, bien que New-Yorkais, a vécu deux fois à Pittsburgh. La première fois pour passer le diplôme de l’école de science informatique Carnegie Mellon, puis lorsque lui et Jenny ont lancé leur entreprise de consultants et écrit leur premier livre pour O’Reilly.
À son retour dans sa ville natale, son premier travail après l’université fut programmeur à EMI-Capitol Records ; ce qui était en fait logique, puisqu’il a fréquenté le lycée LaGuardia de musique, arts et théâtre pour étudier le violoncelle et la guitare basse. Lui et Jenny ont commencé à travailler ensemble dans une entreprise de logiciels de fi nance, où il dirigeait une équipe de programmeurs. Au fi l des années, il a eu le privilège de travailler avec plusieurs programmeurs incroyablement talentueux et aime à penser qu’il en a retiré un certain savoir.
Quand il n’écrit pas de livres, Andrew s’occupe à créer des logiciels inutiles (mais amusants), à jouer de la musique (et, bien plus, aux jeux vidéo), à étudier le taiji et l’aïkido, à avoir une petite amie prénommée Lisa et à posséder un poméranien.
les auteurs
Jenny et Andrew créent des logiciels et écrivent sur l’ingénierie logicielle ensemble depuis leur première rencontre
en 1998. Leur premier livre, Applied Software Project Management, est paru chez O’Reilly Media en 2005,
puis ce fut, Head First PMP, en 2007.
Ils ont fondé Stellman & Greene Consulting en 2003 pour créer un projet de logiciel très intéressant pour des
scientifiques étudiant l’exposition aux herbicides des vétérans du Vietnam. Quand ils n’écrivent pas de logiciel ou
de livres, ils interviennent à de nombreuses conférences et réunions d’ingénieurs informatiques, d’architectes et de
directeurs de projets.
Consultez leur blog : Building Better Software, à http://www.stellman-greene.com
Jenny
Andrew
Merci d’avoir acheté notre livre ! Nous aimons beaucoup écrire sur ce sujet et nous espérons que vous allez adorer nous lire… … parce que nous savons
que vous allez vous amuser en apprenant C#.
Cette photo (et celle du canal Gowanus) sont de Nisha Sondhe
table des matières
ix
Table des matières (version courte)
Table des matières (version longue)
Votre cerveau et C#. Voilà que vous essayez d’apprendre quelque
chose et que votre cerveau fait tout ce qu’il peut pour vous empêcher de
mémoriser. Votre cerveau pense : « Mieux vaut laisser de la place pour les
choses vraiment importantes, comme savoir quels sont les animaux sauvages
qu’il vaut mieux éviter ». Mais comment procéder pour lui faire croire que votre
vie dépend de vos connaissances en C# ?
Intro
À qui s’adresse ce livre ? xxx
Nous savons ce que vous pensez xxxi
La métacognition : apprendre à apprendre xxxiii
Voici ce que vous pouvez faire pour dompter votre cerveau xxxv
Ce dont vous avez besoin pour ce livre xxxvi
Lisez-moi xxxii
L’équipe des relecteurs techniques xxxiv
Remerciements xxxv
Intro xxix
1 Améliorez votre productivité avec C# : des applications en moins de 10 minutes 1
2 Ce n’est rien que du code : sous le capot 43
3 Objets : orientez-vous : donner du sens au code 85
4 Types et références : il est 10h00. Savez-vous où sont vos données ? 123
C# Labo 1 : au champ de courses 163
5 Encapsulation : préservez votre intimité 173
6 Héritage : l’arbre généalogique de votre objet 205
7 Interfaces et classes abstraites : faites tenir leurs promesses à vos classes 251
8 Enums et collections : stocker de grandes quantités de données 309
C# Labo 2 : la quête 363
9 Lire et écrire des fichiers : sauvez le tableau d’octets, sauvez le monde 385
10 Gestion des exceptions : éteindre les incendies, c’est dépassé 439
11 Événements et délégués : ce que fait votre code quand vous regardez ailleurs 483
12 Révision et avant-goût de la suite : savoir, pouvoir et construction de supers trucs 515
13 Contrôles et graphismes : que ça brille 563
14 Capitaine Formidable : la mort de l’objet 621
15 LINQ : aux commandes de vos données 653
C# Labo 3 : les envahisseurs 681
Les restes : les 5 dernières choses dont nous voulions vous parler 703
table des matières
x
Des applications en moins de 10 minutes1 Vous voulez construire rapidement de bons programmes ? Avec C#, vous avez un langage de programmation puissant et un outil précieux
à portée de main. Avec l’IDE de Visual Studio, vous n’aurez plus besoin d’écrire
du code compliqué durant des heures pour qu’un bouton fonctionne. Mieux encore,
vous pourrez vous concentrer sur votre travail, plutôt que d’essayer de vous
rappeler le paramètre de méthode qu’il faut pour nommer un bouton ou son libellé.
Intéressé ? Tournez la page et commençons à programmer.
améliorez votre productivité avec C#
Pourquoi devriez-vous apprendre C# ? 2
C# et l’IDE de Visual Studio simplifi ent beaucoup de tâches 3
Aidez le PDG à supprimer le papier 4
Découvrez les besoins de vos utilisateurs avant de commencer à construire votre programme 5
Voici ce que vous allez construire 6
Ce que vous faites dans Visual Studio… 8
Ce que Visual Studio fait pour vous… 8
Développer l’interface utilisateur 12
Visual Studio, en coulisses 14
Complétez le code auto-généré 15
Vous pouvez déjà lancer votre application 16
Il faut une base de données pour stocker nos informations 18
Créer la table pour la liste des contacts 20
Les champs d’une carte d’un contact sont des colonnes de notre table Gens 22
Finir de construire la table 25
Schématisez vos données pour que votre application puisse y accéder 26
Insérer les données de vos fi ches dans la base de données 28
Relier votre formulaire aux objets de votre base de données avec une source de données 30
Ajouter des contrôles liés à la base de données sur votre formulaire 32
Les bons programmes sont intuitifs 34
Comment transformer VOTRE application en une application pour TOUT LE MONDE 37
Distribuez l’application à vos utilisateurs 38
Vous n’avez PAS fi ni : vous devez tester votre installation 39
Vous avez construit une application complète 40
Nom :
Entreprise :
Téléphone :
E-mail :
Client : Dernier appel :
Hervé Petit
Les industries XYZ
05 01 02 03 99
Oui 26/05/07
Accès aux
données
Solutions du framework .NET
Objets de ty
pe F
orm
table des matières
xi
Sous le capot
Vous êtes un programmeur, pas un simple utilisateur d’IDE. Vous pouvez accomplir un travail conséquent avec l’IDE. Mais il a des limites. Bien
sûr, on mène beaucoup de tâches répétitives lorsque l’on développe une application
et l’IDE est doué pour vous y aider. Mais travailler avec l’IDE n’est pas une fi n en soi.
Vous pouvez pousser vos programmes à faire bien plus en écrivant du code C#. Une
fois le coup de main pris, il n’y aura rien d’impossible pour vos programmes.
ce n’est rien que du code
2Quand vous faites ceci… 44
…l’IDE fait cela 45
D’où viennent les programmes 46
L’IDE vous aide à coder 48
Quand vous changez quelque chose dans l’IDE, vous modifi ez aussi votre code 50
Anatomie d’un programme 52
Votre programme sait par où commencer 54
Vous pouvez modifi er le point d’entrée du programme 56
Deux classes peuvent se trouver dans le même espace de noms 61
Vos programmes utilisent des variables pour travailleravec des données 62
C# utilise des symboles mathématiques familiers 64
Les boucles réalisent une action en boucle 65
Il est temps de commencer à coder 66
Les instructions if/else prennent des décisions 67
Défi nir des conditions et voir si elles sont vraies 68
Construisez ce formulaire
Espace de nomsClasseMéthode 1instructioninstruction
Méthode 2instructioninstruction
À chaque fois que vous faites un nouveau programme, vous lui définissez un espace de noms pour que son code soit séparé des classes du framework .NET.
Une classe contient une ou plusieurs méthodes. Vos méthodes doivent toujours vivre dans une classe. Et les méthodes sont faites d’instructions, comme celles que vous avez déjà vues.
Une classe contient un morceau de votre programme (même si de très petits programmes peuvent n’avoir qu’une classe).
table des matières
xii
3 Donner du sens au code
Tous les programmes que vous écrivez résolvent un problème. Quand vous construisez un programme, il vaut mieux commencer par réfl échir au problème
que votre programme est censé résoudre. C’est pourquoi les objets sont vraiment utiles.
Ils vous permettent de structurer votre code à partir du problème à résoudre, pour que vous
puissiez passer votre temps à réfl échir au problème sur lequel vous essayez de travailler
plutôt que de vous enliser dans les mécanismes de l’écriture du code. Si vous utilisez bien
les objets, vous obtenez du code intuitif à écrire, facile à lire et à modifi er.
objets : orientez-vous
Max réfl échit à ses problèmes 86
Le système de navigation de Max réfl échit à ses problèmes 87
La classe Navigateur de Max a des méthodes pour défi nir et modifi er des itinéraires 88
Utilisez ce que vous avez appris pour créer une application simple 89
Max a une idée 90
Max peut utiliser des objets pour résoudre son problème 91
On utilise une classe pour construire un objet 92
Quand on crée un nouvel objet à partir d’une classe,on crée une instance de cette classe 93
Une meilleure solution… avec les objets ! 94
Une instance utilise des champs pour mémoriser les choses 98
Créons des instances ! 99
Merci la mémoire 100
Dans l’esprit de votre programme 101
Vous pouvez utiliser les noms des classes et des méthodes pour rendre votre code intuitif 102
Donnez une structure naturelle à vos classes 104
Les diagrammes de classe vous aident à organiser vos classes logiquement 106
Construire une classe pour des amis 110
Créer un projet pour vos amis 111
Créer un formulaire pour interagir avec vos amis 112
Il existe un moyen plus simple d’initialiser des objets 115
Quelques idées pour concevoir des classes intuitives 116
new Navigateur()
new Navigateur()
Objet Navigat
eurnavigateur3
Objet Navigat
eurnavigateur1
Objet Navigat
eurnavigateur2
new Navigateur()
new
ne
n
Navigateur
DefinitDestination()ModifiePourEviter()ModifiePourInclure()TrouveItineraire()TrouveDureeItineraire()DistanceTotale()
Quand vous définissez une classe, vous définissez ses méthodes, tout comme un plan définit l’ossature d’une maison.
Vous pouvez utiliser un plan pour construire x maisons et vous pouvez utiliser une seule classe pour créer x objets.
table des matières
xiii
4 Il est 10h00. Savez-vous où sont vos données ?
Types de données, bases de données, une donnée pour une achetée… un sujet incontournable. Sans données, vos programmes sont
inutiles. Vous avez besoin des informations de vos utilisateurs et vous les utiliserez pour
chercher ou produire de nouvelles informations à leur renvoyer. En fait, presque tout ce
que vous faites en programmation implique, d’une manière ou d’une autre, de travailler
avec des données. Dans ce chapitre, vous allez découvrir tous les détails des types de
données en C#, comment travailler avec des données dans votre programme et même
découvrir quelques secrets embarrassants sur les objets (psstt… les objets sont des
données, eux aussi).
types et références
Le type de variable détermine le genre de données qu’elle peut stocker 124
Une variable est comme un gobelet de données à emporter 126
10 kilos de données dans un sac de 5 kilos 127
Même quand un nombre fait la bonne taille, on ne peut pas simplement l’affecter à n’importe quelle variable 128
Si vous convertissez une valeur trop grande, C# l’ajuste automatiquement 129
C# effectue certaines conversions automatiquement 130
Quand vous appelez une méthode, les variables doivent correspondre aux types des paramètres 131
Combiner = avec un opérateur 136
Les objets sont des variables, eux aussi 137
Faites référence à vos objets avec des variables de référence 138
Les références sont comme des étiquettes pour votre objet 139
S’il n’a plus de références, votre objet passe au ramasse-miettes 140
Les références multiples et leurs effets secondaires 142
Deux références impliquent DEUX moyens de modifier les données d’un objet 147
Un cas particulier : les tableaux 148
Les tableaux peuvent aussi avoir beaucoup de variables de référence 149
Bienvenue au stand de sandwichs pas chers de la belle Hélène ! 150
Les objets utilisent des références pour se parler 152
Là où nul objet n’est encore allé 153
Objet Chien 2
fidopouf!
Objet Chien 1Lubie
Chien fido;
Chien lubie = new Chien();
fido = new Chien();
lubie = null;
Objet Chien 2
fido
Objet Chien 1Lubie
table des matières
xiv
table destable des matièrestable des
Riri, Fifi et Loulou adorent aller voir les courses, mais ils sont las de perdre tout leur argent. Ils ont besoin de vous pour construire un simulateur qui devinera qui va gagner avant qu’ils ne misent leur argent. Si vous faites du bon travail, ils vous offriront un pourcentage de leurs gains.
C# Labo 1Au champ de
courses
Projet : créer un simulateur de circuit de courses 164
Le produit fi ni 172
xiv
table des matières
xv
5 Préservez votre intimité
Vous avez déjà eu envie d’un peu plus d’intimité ? Vos objets aussi. Tout comme vous n’acceptez pas que quelqu’un en qui vous n’avez
pas confi ance lise votre journal intime ou feuillette vos relevés de banque, de bons objets
ne laissent pas d’autres objets fouiner dans leurs champs. Dans ce chapitre, vous allez
découvrir la puissance de l’encapsulation. Vous allez rendre privées les données de
votre objet et ajouter des méthodes pour protéger l’accès à ces données.
encapsulation
Catherine est organisatrice d’événements 174
Que fait le programme de devis ? 175
Le test de Catherine 180
Chaque option doit être calculée individuellement 182
Il est vite arrivé de mal utiliser vos objets par accident 184
Encapsuler signifi e garder certaines données d’une classe privées 185
Utilisez l’encapsulation pour contrôler l’accès aux champs et aux méthodes de votre classe 186
Mais le champ VraiNom est-il VRAIMENT protégé ? 187
Les champs et méthodes privés ne sont accessibles que de l’intérieur de la classe 188
Quelques idées pour encapsuler des classes 191
L’encapsulation garde vos données impeccables 192
Les propriétés facilitent l’encapsulation 193
Créer une application de test pour la classe Agriculteur 194
Utilisez des propriétés automatiques pour terminer la classe 195
Et si l’on veut modifi er le multiplicateur ? 196
Utilisez un constructeur pour initialiser des champs privés 197
Nombre de personnes.Repas 25 € par per-sonne)
Option santé ?
Alcool(20 € par personne)
Option fantaisie ?
Jus et sodas(5 € par
personne +5% de réduction sur le coût total)
Décorations fantaisie(15 € par personne + 50 € de frais)
Décorationsnormales(7,50 € par personne + 30 € de frais)
Oui
Non
Oui
Non
agentKgb
agentCia
agentMi5
table des matières
xvi
6 L’arbre généalogique de votre objet
Parfois, on veut VRAIMENT être comme ses parents.Avez-vous déjà vu un objet faire presque exactement ce que vous attendez d’un autre
objet ? Vous êtes-vous laissé aller à penser qu’en changeant juste quelques éléments,
cet objet serait parfait ? Hé bien c’est exactement la raison pour laquelle l’héritage compte
parmi les concepts et techniques les plus puissants de C#. Avant la fi n du chapitre, vous
aurez appris comment sous-classer un objet pour obtenir son comportement, tout en
gardant la souplesse de modifi er ce comportement. Vous éviterez le code dupliqué,
modéliserez le monde réel et obtiendrez du code plus facile à maintenir.
héritage
Catherine organise aussi les anniversaires 206
Il vous faut une classe Anniversaire 207
Encore une chose... pouvez-vous ajouter des frais de 100 € pour les fêtes de plus de 12 personnes ? 213
Si vos classes utilisent l’héritage,vous n’écrirez votre code qu’une seule fois 214
Construisez la maquette de votre classe en allant du généralau plus spécifi que 215
Comment concevriez-vous un simulateur de zoo ? 216
Utilisez l’héritage pour éviter le code dupliqué dans les sous-classes 217
Des animaux différents ont des cris différents 218
Comment regrouper les animaux ? 219
Créer la hiérarchie de classes 220
Une sous-classe étend sa classe de base 221
Utilisez les deux points pour hériter d’une classe de base 222
Nous savons que l’héritage ajoute les champs, propriétéset méthodes de la classe de base à la sous-classe... 225
Une sous-classe peut redéfi nir des méthodes pour modifi er ou remplacer les méthodes dont elle a hérité 226
Partout où vous pouvez utiliser une classe de base,remplacez-la par une de ses sous-classes 227
Une sous-classe peut accéder à sa classe de base avec le mot-clé base 232
Si la classe de base a un constructeur, votre sous-classe doit en avoir un aussi 233
Vous êtes prêt à boucler le travail pour Catherine ! 234
Construire un système de gestion de ruche 239
D’abord, on construit le système de base 240
Utilisez l’héritage pour étendre le système de gestion de ruche 245
table des matières
xvii
7 Faire tenir leurs promesses aux classes
Des actions valent mieux que des mots. Vous aurez par moment besoin de regrouper vos objets en fonction de ce qu’ils savent
faire plutôt que selon les classes dont ils héritent. C’est là que les interfaces entrent en
jeu : elles vous permettent de travailler avec n’importe quelle classe capable de faire le
travail. Mais un grand pouvoir entraîne une lourde responsabilité et une classe qui
implémente une interface doit promettre de remplir toutes ses obligations... sinon le
compilateur lui brisera les rotules, voyez-vous ?
interfaces et classes abstraites
Retour à la ruche 252
On peut utiliser l’héritage pour créer des classes pour les différents types d’abeilles 253
Une interface indique à une classe qu’elle doit implémentercertaines méthodes et propriétés 254
Utiliser le mot-clé interface pour défi nir une interface 255
Créez maintenant une instance de NectarPiqueur qui fait les deux travaux 256
Les classes qui implémentent une interface doivent inclure TOUTES les méthodes de l’interface 257
Entraînez-vous à utiliser les interfaces 258
On ne peut pas instancier une interface, mais on peut référencer une interface 260
Les références d’interface fonctionnent comme celles des objets 261
Vous pouvez savoir si une classe implémente telle ou telle interface avec « is » 262
Les interfaces peuvent hériter d’autres interfaces 263
Le RoboBzz 4000 peut faire le travail d’une ouvrièresans dépenser un miel précieux 264
is vous dit ce qu’implémente un objet,as dit au compilateur comment traiter votre objet 265
Une Cafetiere est aussi un Appareil 266
On peut surclasser des objets et des interfaces 267
Sous-classer vous permet de retransformer votre appareil en cafetière 268
Surclasser ou sous-classer fonctionne aussi avec les interfaces 269
Au-delà de public et private 273
Les modifi cateurs d’accès changent la portée 274
Certaines classes ne devraient jamais être instanciées 277
Une classe abstraite est comme un croisement entre une classe et une interface 278
Certaines classes ne devraient jamais être instanciées 280
Une méthode abstraite n’a pas de corps 281
Le polymorphisme signifi e qu’un objet peut prendre plusieurs formes 289
Héritage
Abstraction
Encapsulation
Polymorphisme
LieuNomSorties
Description()
PieceDecoration
ExterieurChaud
SéjourSalle à manger
CuisineAvant
Arrière
Jardin
table des matières
xviii
8 Stocker de grandes quantités de données
Un malheur n’arrive jamais seul. Dans le monde réel, vous n’avez pas la chance de gérer vos données petit bout par petit
bout. Non, vos données vous arrivent par tas, par brassées, par charretées. Il vous faut
des outils très puissants pour tout organiser et c’est là que les collections entrent en jeu.
Elles vous permettent de stocker, trier et gérer toutes les données dans lesquelles vos
programmes doivent s’immerger. Ainsi vous pouvez vous concentrer sur les programmes
qui travaillent avec vos données et laisser les collections s’occuper du suivi.
enums et collections
Les chaînes ne fonctionnent pas toujours pour stocker des catégories de données 310
Les enums vous permettent d’énumérer un ensemble de valeurs valides 311
Les enums permettent de représenter des nombres par des noms 312
On pourrait utiliser un tableau pour créer un jeu de cartes... 315
Il est difficile de travailler avec des tableaux 316
Les listes permettent de conserver facilement des collections de... ce que l’on veut 317
Les listes sont plus souples que les tableaux 318
Les listes rétrécissent et grandissent de façon dynamique 321
Les objets List peuvent stocker n’importe quel type 322
Les initialiseurs de collections fonctionnent comme les initialiseurs d’objets 326
Créons une liste de Canards 327
Les listes sont faciles, mais les TRIER peut être difficile 328
Deux façons de trier vos canards 329
Utilisez IComparer pour indiquer comment trier à votre List 330
Créez une instance de votre objet comparateur 331
IComparer peut faire des comparaisons complexes 332
Utilisez un dictionnaire pour stocker des clés et des valeurs 335
Résumé des fonctionnalités de Dictionary 336
Votre clé et votre valeur peuvent avoir des types différents 337
Vous pouvez construire vos propres méthodes surchargées 343
Et encore d’AUTRES types de collections... 355
Queue applique la règle du premier entré, premier sorti 356
Stack applique la règle du dernier entré, premier sorti 357
pouf!
table des matières
xix
matières matières matières
C# Labo 2La quête
Votre mission est de construire un jeu d’aventure où un vaillant aventurier s’est lancé dans une quête pour vaincre, niveau après niveau, des ennemis mortels. Vous allez construire un système de tours, ce qui signifi e que le joueur se déplace une fois puis les ennemis se déplacent. Le joueur peut se déplacer ou attaquer, puis chaque ennemi a une chance de se déplacer et attaquer. Le jeu continue jusqu’à ce que le joueur ait vaincu tous les ennemis des sept niveaux ou jusqu’à ce qu’il meure.
Les spécifi cations : construire un jeu d’aventure 364
Le jeu ne fait ne commencer ! 384
xix
table des matières
xx
9 Sauvez le tableau d’octets, sauvez le monde
Parfois, l’obstination, ça paye. Jusqu’ici, tous vos programmes ont eu une
vie assez courte. Ils se lancent, s’exécutent un moment et se ferment. Mais ce n’est
pas toujours suffisant, surtout si vous gérez des informations importantes. Vous devez
pouvoir enregistrer votre travail. Dans ce chapitre, nous allons voir comment écrire des
données dans un fichier, puis comment lire ces informations dans un fichier. Vous allez
découvrir les classes Stream .NET et vous aurez également un aperçu des mystères de
l’hexadécimal et du binaire.
lire et écrire des fichiers
69 117 114 101 107 97 33
C# utilise des flux pour lire et écrire des données 386
Des flux différents lisent et écrivent des choses différentes 387
Un FileStream écrit des octets dans un fichier 388
Il faut deux objets pour lire et écrire 393
Les données peuvent passer par plusieurs flux 394
Utilisez des objets intégrés pour afficher des boîtes de dialogue 397
Une boîte de dialogue est aussi un objet 399
Utilisez les classes intégrées File et Directory pour travailler avec des fichiers et des répertoires 400
Utilisez les dialogues de fichiers pour ouvrir et enregistrer des fichiers 403
IDisposable s’assure que vos objets sont libérés correctement 405
Éviter les erreurs système de fichiers avec les instructions using 406
Écrire des fichiers implique souvent de prendre beaucoup de décisions 412
Utilisez une instruction switch pour faire le bon choix 413
Ajouter un constructeur JeuCartes() surchargé qui lit un jeu de cartes depuis un fichier 415
Qu’arrive-t-il à un objet quand il est sérialisé ? 417
Mais qu’EST-ce que l’état d’un objet au juste ? Que doit-on enregistrer ? 418
Quand un objet est sérialisé, tous les objets qu’il référence sont aussi sérialisés... 419
La sérialisation vous permet de lire ou écrire un objet entier en une fois 420
Si vous voulez que votre classe soit sérialisable, marquez-la avec l’attribut [Serializable] 421
.NET convertit automatiquement du texte en Unicode 425
C# peut utiliser des tableaux d’octets pour déplacer des données 426
Utilisez BinaryWriter pour écrire des données binaires 427
On peut aussi lire et écrire manuellement des fichiers sérialisés 429
StreamReader et StreamWriter iront très bien 433
objet FileStream
objet FileStream
objet FileStream
objet FileStream
table des matières
xxi
10 Éteindre les incendies, c’est dépassé
Les programmeurs ne sont pas censés être des pompiers. Vous avez travaillé d’arrache-pied, parcouru des manuels techniques, quelques
sympathiques livres Tête la première et vous avez atteint le sommet de votre profession :
maître programmeur. Mais vous avez toujours des appels du boulot parce que votre
programme bogue ou ne se comporte pas comme il le devrait. Rien ne vous gâche
autant le plaisir de programmer que de devoir réparer un bogue bizarre… Mais grâce
à la gestion d’exceptions, vous pouvez écrire du code pour gérer les problèmes qui
se présentent. Mieux encore, vous pouvez même réagir face à ces problèmes et faire
fonctionner le programme malgré eux.
gestion des exceptions
Léo a besoin d’excuses à emporter 440
Quand votre programme lève une exception, .NET génère un objet Exception 444
Le code de Léo a fait quelque chose d’inattendu 446
Tous les objets exception héritent d’Exception 448
Le débogueur vous aide à repérer et éviter les exceptions dans votre code 449
Utilisez le débogueur de l’IDE pour découvrir exactement ce qui a mal tourné dans le gestionnaires d’excuses 450
Oh oh, le code a encore des problèmes... 453
Gérer les exceptions avec try et catch 455
Que se passe-t-il quand vous voulez appeler une méthode à risques ? 456
Utilisez le débogueur pour suivre l’exécution de try/catch 458
Si vous avez du code qui doit TOUJOURS tourner, utilisez un bloc finally 460
Utilisez l’objet Exception pour obtenir des informations sur le problème 465
Utilisez plusieurs blocs catch pour gérer plusieurs types d’exceptions 466
Une classe lève une exception, une autre classe intercepte l’exception 467
Les Abeilles ont besoin d’une exception PlusDeMiel 468
Évitez facilement beaucoup de problèmes : using vous offre gratuitement try et finally 471
Évitez les exceptions : implémentez IDisposable pour nettoyer 472
Le pire bloc catch JAMAIS vu : des commentaires 474
Les solutions temporaires conviennent (temporairement) 475
Quelques idées simples pour la gestion des exceptions 476
Finalement, Léo prend ses vacances... 481
Je m’ennuie au travail aujourd’hui. Je veux aller faire de la plongée. C’est le moment de faire appel au Gestionnaire d’excuses.
table des matières
xxii
11 Ce que fait votre code quand vous regardez ailleurs
événements et délégués
Vos objets commencent à penser par eux-mêmes. Vous ne pouvez pas toujours contrôler ce que font vos objets. Parfois des choses...
arrivent. Vous avez alors besoin que vos objets soient assez intelligents pour anticiper.
C’est le rôle des événements. Un objet publie un événement, d’autres objets s’abonnent
et tout le monde travaille ensemble pour maintenir le mouvement. C’est super, jusqu’à ce
que vous ayez trop d’objets réagissant au même événement. C’est là que les fonctions
de rappel (callback) se révèlent utiles.
Avez-vous déjà souhaité que vos objets puissent penser par eux-mêmes ? 484
Comment un objet SAIT-il quand réagir ? 484
Quand un ÉVÉNEMENT se produit... les objets écoutent 485
Un objet lève son événement, les autres l’écoutent... 486
Puis les autres objets gèrent l’événement 487
Relier les points 488
L’IDE crée automatiquement des gestionnaires d’événement 492
Vos formulaires utilisent tous des événements 498
Relier les transmetteurs de l’événement aux receveurs 500
Un délégué REPRÉSENTE une vraie méthode 501
Les délégués à l’œuvre 502
Tout objet peut s’abonner à un événement public... 505
Utilisez une fonction de rappel plutôt qu’un événement pour raccorder un seul objet à un délégué 507
Une fonction de rappel utilise un délégué, mais PAS d’événement 508
Nous voulons que le Lanceur
intercepte cette balle.Balle.OnBalleEnJeu(70, 24.5)
Lanceur.IntercepteBalle(70, 28)
Quand la balle est
frappée, BalleFrappee()
est appelée.
La balle a été frappé avec une trajectoire à 70 degrés de la plaque qui sert de point de départ et elle va voyager 24,5 mètres.
Le lanceur peut gérer l’angle avec lequel la balle a été frappée et la distance (28 est supérieur à 24,5).
objet Balle
objet Lanceur
table des matières
xxiii
12 Savoir, pouvoir et constructions de supers trucs
révision et avant-goût de la suite
La connaissance ne sert à rien jusqu’à ce qu’on en FASSE quelque chose. Tant que vous n’aurez pas vraiment écrit du code fonctionnel, il est
diffi cile de savoir si vous comprenez vraiment certains des concepts les plus diffi ciles de
C#. Dans ce chapitre, nous allons découvrir quelques nouveautés, entre autres, les timers
et la gestion des collections avec LINQ. Nous allons aussi réaliser la première phase d’une
application très complexe pour vérifi er que vous avez bien compris ce que vous avez
appris dans les chapitres précédents. Attachez vos ceintures… nous allons construire un
super logiciel.
Vous avez fait de gros progrès mon vieux 516
Nous sommes aussi devenu apiculteurs 517
L’architecture du simulateur de ruche 518
Construire le simulateur de ruche 519
Vie et mort d’une fl eur 523
Nous avons maintenant besoin d’une classe Abeille 524
Compléter la classe Ruche 532
La méthode Evolue() de la ruche 533
Nous sommes prêt pour le Monde 534
Nous construisons un système à tours 535
Donner des comportements aux abeilles 542
Le formulaire principal dit au monde d’évoluer 544
Nous pouvons utiliser le Monde pour obtenir des statistiques 545
Les Timers déclenchent des événements à répétition 546
Le minuteur utilise un délégué en coulisses 547
Travaillons avec des groupes d’abeilles 554
Une collection collectionne... des DONNÉES 555
LINQ facilite le travail avec les données dans les collections et les bases de données 557
objet Fle
ur
Age = 0Nectar = 1.5
objet Fle
ur
Age = 17809
Nectar = 3.2
objet Fle
ur
Age = 30291Age = 30291Nectar = .83Nectar = .83Nectar = .83Nectar = .83
MORTE
eueuerMORTEMORTEMORTEMORTEMORTEMORTEMORTEMORTEMORTEMORTEVivante = false
Vie e t mort d’une f leur
table des matières
xxiv
13 Que ça brille
contrôles et graphismes
Il faut parfois prendre les graphismes en main. Nous avons passé beaucoup de temps à nous reposer sur les contrôles pour gérer tout
l’aspect de nos applications. Mais cela n’est pas toujours suffi sant, comme pour animer
une image. Une fois que l’on entre dans l’animation, on en vient à créer ses propres
contrôles pour des programmes .NET, y ajouter peut-être un peu de double buffering et
même dessiner directement sur des formulaires. Tout commence avec l’objet Graphics,
les Bitmaps et une détermination à ne pas accepter le statu quo au niveau du graphisme.
Vous utilisez des contrôles depuis le début pour interagir avec vos programmes 564
Les contrôles du formulaire sont de simples objets 565
Ajoutez un agentDeRendu à votre architecture 568
Les contrôles conviennent bien aux éléments d’affi chage visuel 570
Créer votre premier contrôle animé 573
Vos contrôles doivent aussi libérer leurs contrôles ! 577
Un contrôle utilisateur permet de construire un contrôle 578
Ajoutez au projet les Forms de la ruche et du champ 582
Créer l’AgentDeRendu 583
Examinons ces problèmes de performance de plus près 590
Vous avez redimenionné vos Bitmaps grâce à un objet Graphics 592
Les ressources de votre image sont stockées dans des objets Bitmap 593
Utilisez System.Drawing pour CONTRÔLER les graphismes 594
Découverte des graphismes GDI+ en 30 secondes 595
Utilisez des Graphics pour dessiner une image sur un formulaire 596
Graphics peut régler notre problème de transparence... 601
Utilisez Paint pour fi xer vos graphismes 602
Gros plan sur la façon dont les formulaires et les contrôles se repeignent 605
Le double buffering lisse l’apparence de l’animation 608
Le double buffering est intégré aux Forms et aux contrôles 609
Imprimer avec un objet Graphics et un gestionnaire d’événement 614
PrintDocument fonctionne avec le dialogue d’impressionet imprime des objets fenêtre d’aperçu 615
table des matières
xxv
14CAPITAINE FORMIDABLELA MORT
DE L’OBJET
Capitaine Formidable, l’objet le plus extraordinaire d’Objectville, poursuit son pire ennemi... 622
Votre dernière chance de FAIRE quelque chose... le finaliseur de votre objet 628
Quand un finaliseur s’exécute-t-il, EXACTEMENT ? 629
Dispose() fonctionne avec using, les finaliseurs fonctionnent avec le ramasse-miettes 630
Les finaliseurs ne peuvent pas compter sur la stabilité 632
Sérialiser un objet dans sa méthode Dispose() 633
Pendant ce temps, dans les rues d’Objectville... 636
Une struct ressemble à un objet... 637
..mais ne vit pas sur le tas 637
Les valeurs sont copiées, les références sont affectées 638
Les structs sont des types de valeur ; les objets des types de référence 639
La pile vs. le tas : plus d’infos sur la mémoire 641
Capitaine Formidable... pas tant que ça 645
Les méthodes d’extension ajoutent des nouveaux comportements à des classes EXISTANTES 646
Étendre un type fondamental : string 648
table des matières
xxvi
15 Aux commandes de vos données
LINQ
Ce monde est gouverné par les données... il vaut mieux savoir comment vivre avec. Fini le temps où l’on pouvait programmer pendant des jours,
voire des semaines, sans gérer des masses de données. Aujourd’hui, tout est centré
sur les données. D’ailleurs, vous devrez souvent travailler avec des données provenant
de plusieurs sources... et dans différents formats. Bases de données, XML, collections
d’autres programmes... tout cela fait partie du travail d’un bon programmeur en C#. C’est
là que LINQ entre en jeu. LINQ vous permet non seulement de lancer des requêtes de
façon simple et intuitive, mais aussi de regrouper des données et de fusionner des
données de différentes sources.
Un projet facile... 654
...mais c’est la pagaille dans les données 655
LINQ peut récupérer des données de différentes sources 656
Les collections .NET sont déjà prêtes pour LINQ 657
LINQ rend les requêtes faciles 658
LINQ est simple... pas vos requêtes 659
LINQ est versatile 662
LINQ peut combiner vos résultats dans des groupes 667
Combiner les valeurs de Romain dans des groupes 668
Combiner deux collections en une requête avec join 671
Romain a économisé un paquet de blé 672
Connecter LINQ à une base de données SQL 674
Utilisez une requête avec join pour relier Starbuzz et Papier d’Objectville 678
table des matières
xxvii
C# Labo 3Les envahisseurs
matières matières matières
Dans ce labo, vous allez rendre hommage à l’un des jeux les plus populaires, vénérés et répliqués de l’histoire des jeux vidéo, un jeu qui n’a pas besoin d’être présenté plus longuement. Il est temps de créer les Envahisseurs.
Le grand-père des jeux vidéo 682
Pourtant il reste des choses à faire... 701
xxviixxviixxvii
table des matières
xxviii
A Les 5 dernières choses dont nous voulions vous parler
les restes
La fête ne fait que commencer ! Nous vous avons présenté de nombreux outils effi caces pour créer des logiciels
puissants avec C#. Mais il n’était pas possible d’aborder ici tous les outils,
technologies ou techniques ; nous aurions manqué de pages. Nous avons dû prendre
des décisions très diffi ciles quand aux sujets à développer. Ainsi, voici ceux qui ont été
omis ; même si nous n’avons pas pu les aborder, ils restent importants et utiles à nos
yeux et nous voulions vous en faire une courte présentation.
n°1 LINQ to XML 704
n°2 Refactorisation 706
n°3 Quelques-uns de nos composants préférés de la Boîte à outils 708
n°4 Applications console 710
n°5 Windows Presentation Framework 712
Saviez-vous que C# et le framework .NET peuvent... 714