Académique Documents
Professionnel Documents
Culture Documents
programmer en C#
sur .NET
Par Narvarth
www.openclassrooms.com
Sommaire
Sommaire ........................................................................................................................................... 2
Lire aussi ............................................................................................................................................ 2
Apprenez programmer en C# sur .NET ........................................................................................... 4
Partie 1 : Les fondamentaux ............................................................................................................... 5
Introduction ........................................................................................................................................................................ 6
Prface ........................................................................................................................................................................................................................ 6
qui sadresse ce tutoriel ? ........................................................................................................................................................................................ 6
Esprit du tutoriel .......................................................................................................................................................................................................... 6
Dure dapprentissage ................................................................................................................................................................................................ 6
Composition du cours ................................................................................................................................................................................................. 6
Le code ........................................................................................................................................................................................................................ 7
Allez plus loin ! ............................................................................................................................................................................................................ 7
Comment sont crs les programmes ? ..................................................................................................................................................................... 8
Un programme : qu'est-ce que c'est ? ......................................................................................................................................................................... 8
Comment crer des programmes "simplement" ? ...................................................................................................................................................... 8
Le langage C# et le framework .NET ........................................................................................................................................................................ 11
Aperu historique ...................................................................................................................................................................................................... 12
Exemple de programme : Paint .NET ........................................................................................................................................................................ 13
quoi ressemble le C# ? .......................................................................................................................................................................................... 13
Installer un IDE pour programmer ............................................................................................................................................................................. 16
Lequel choisir ? ......................................................................................................................................................................................................... 16
Installation de Microsoft Visual C# 2010 Express Edition ......................................................................................................................................... 16
Tour d'horizon de Visual C# Express 2010 ............................................................................................................................................................... 23
Allure gnrale .......................................................................................................................................................................................................... 23
Fonctionnement ........................................................................................................................................................................................................ 24
Bonus ........................................................................................................................................................................................................................ 24
Premiers pas sur console ................................................................................................................................................ 27
Cration de la solution .............................................................................................................................................................................................. 27
Lancement depuis l'invite de commandes (console) ................................................................................................................................................ 30
Les variables ................................................................................................................................................................... 33
Qu'est-ce que c'est ? ................................................................................................................................................................................................. 33
Donner un nom ses variables ................................................................................................................................................................................ 33
Types de variables de base ....................................................................................................................................................................................... 33
Illustration avec sizeof et typeof ................................................................................................................................................................................ 34
Conventions d'criture pour le typage des donnes crites "en dur" dans le code .................................................................................................. 35
Utiliser des variables ................................................................................................................................................................................................. 35
Dclaration ................................................................................................................................................................................................................ 35
Valeur par dfaut ....................................................................................................................................................................................................... 35
Attribuer une valeur ................................................................................................................................................................................................... 36
Type valeur ou rfrence ? ........................................................................................................................................................................................ 36
Type valeur ................................................................................................................................................................................................................ 36
Type rfrence .......................................................................................................................................................................................................... 36
Les numrations ...................................................................................................................................................................................................... 37
Les oprateurs ................................................................................................................................................................ 39
Les oprateurs mathmatiques ................................................................................................................................................................................. 39
Simplifications d'criture ............................................................................................................................................................................................ 40
Priorits des oprateurs ............................................................................................................................................................................................ 41
Les oprateurs logiques ............................................................................................................................................................................................ 41
Autres oprateurs ...................................................................................................................................................................................................... 42
L'oprateur d'affectation ............................................................................................................................................................................................ 42
Les oprateurs de comparaison ................................................................................................................................................................................ 42
L'oprateur ternaire "?" .............................................................................................................................................................................................. 43
Les conditions et les boucles conditionnelles ................................................................................................................. 43
if et sa famille ............................................................................................................................................................................................................ 44
switch : un if spcial .................................................................................................................................................................................................. 45
while .......................................................................................................................................................................................................................... 46
for .............................................................................................................................................................................................................................. 47
Les mthodes .................................................................................................................................................................. 49
Crer une mthode ................................................................................................................................................................................................... 49
Appeler une mthode ................................................................................................................................................................................................ 50
Passage par valeur ................................................................................................................................................................................................... 50
Passage par rfrence .............................................................................................................................................................................................. 52
La surcharge ............................................................................................................................................................................................................. 54
Les classes (1/2) ............................................................................................................................................................. 55
Crer une classe ....................................................................................................................................................................................................... 56
Crer un objet ............................................................................................................................................................................................................ 59
Utiliser un objet ......................................................................................................................................................................................................... 61
Accder aux membres d'un objet .............................................................................................................................................................................. 61
Les proprits ............................................................................................................................................................................................................ 61
La comparaison d'objets ........................................................................................................................................................................................... 63
Des mthodes importantes ....................................................................................................................................................................................... 64
Les classes (2/2) ............................................................................................................................................................. 65
Le modificateur "static" .............................................................................................................................................................................................. 66
Application console : tude du code ......................................................................................................................................................................... 67
www.openclassrooms.com
Sommaire 3/132
www.openclassrooms.com
Sommaire 4/132
Par Narvarth
Il existe des centaines de langages de programmation, comme le C, le C++, Python, Java... Chacun a ses avantages et dfauts. Le
C# (aussi crit C Sharp et prononc "c sharp" voire "ci sharp" l'anglaise) n'est peut-tre qu'un langage de plus vos yeux,
mais il est en fait trs important dans le monde de la programmation !
Rcent : il a t cr par Microsoft au dbut des annes 2000, ce qui en fait un langage assez jeune (compar au C, au
C++ et Java).
Idal sous Windows & Windows Phone 7 : c'est le langage recommand pour dvelopper sous Windows aujourd'hui,
mais on s'en sert aussi pour crer des applications Windows Phone 7, pour Silverlight, ASP...
Libre : le langage est ouvert, et on peut s'en servir pour dvelopper des applications sous Linux notamment. Le fait qu'il
soit issu de Microsoft ne l'empche pas d'avoir son lot d'aficionados dans le monde du libre.
Inspir de Java : mme s'il a ses spcificits, il ressemble globalement plus au Java qu'au C ou au C++ contrairement ce
que son nom pourrait laisser penser.
Associ au framework .NET : un langage seul comme le C# ne permet pas de faire grand chose. On l'associe en gnral
une bote outils que l'on appelle le framework .NET (aussi crit Dot NET et prononc "dotte nette") qui offre toutes les
possibilits que l'on peut imaginer : accs rseau, cration de fentres, appel une base de donnes...
Apprci en entreprise : si Java reste un des langages les plus utiliss en entreprise, C# se prsente comme un srieux
challenger. C'est aujourd'hui une comptence recherche en entreprise.
J'ai crit ce tutoriel spcialement pour les dbutants qui veulent dcouvrir le C#, comme le veut la tradition du Site du
Zro.
Peut-tre qu'il y en a parmi vous qui connaissent dj le C, le C++ ou Java. Cela pourra vous aider apprendre plus
rapidement, mais ce n'est absolument pas grave si vous n'avez jamais fait de programmation avant.
www.openclassrooms.com
Apprenez programmer en C# sur .NET 5/132
Visual Studio
Paint .NET (programme C#), Windows Phone 7 et le code sous Visual Studio
www.openclassrooms.com
Partie 1 : Les fondamentaux 6/132
Dans cette premire partie, nous allons dcouvrir quoi ressemble le langage C# et ce qu'est .NET. Nous apprendrons
manipuler Visual Studio, l'outil de travail du dveloppeur C#. Enfin et surtout, nous allons crer nos premiers programmes
console en manipulant nos premires instructions en C#.
Cette partie ne sera pas la plus graphique et la plus interactive, mais il faut bien commencer quelque part ! Prenez le soin de bien
apprendre toutes les notions thoriques, elles vous seront indispensables pour la suite.
Nous aurons l'occasion de pratiquer avec deux petits TP pour vrifier que vous avez bien suivi les premiers chapitres.
Vous tes prts ? Moi aussi, a tombe bien ! Allez c'est parti, on y va !
Introduction
Dans ce tout premier chapitre, nous allons dcouvrir ce qu'est le C#, son histoire et son rapport avec le framework .NET.
D'ailleurs, vous ne savez pas ce qu'est un framework ? Ce n'est pas grave, je vous rappelle que c'est un cours pour dbutants,
tout cela sera expliqu !
Avant d'aller plus loin, une petite prface vous prsentera l'esprit du tutoriel et vous donnera quelques conseils pour le suivre
dans les meilleures conditions.
Prface
qui sadresse ce tutoriel ?
Aux dbutants ! Pas besoin d'avoir fait de la programmation avant pour suivre ce tutoriel ! Je vais donc faire de mon mieux pour
dtailler au maximum mes explications, c'est promis.
Mon but est rellement de rendre ce tutoriel accessible pour les dbutants.
Bien sr, il y en a peut-tre parmi vous qui ont dj fait du C, du C++, du Java... videmment, si vous avez dj programm, ce
sera plus facile pour vous (surtout pour la premire partie qui prsente les bases du langage). Attention nanmoins de ne pas
vouloir aller trop vite : le C# ressemble d'autres langages mais il a quand mme ses spcificits !
Esprit du tutoriel
Nous allons dcouvrir ensemble de nombreuses choses en apprenant programmer en C#. Il y aura bien entendu des TP pour
vous faire pratiquer, afin que vous puissiez vous rendre compte de ce que vous tes capables de faire aprs avoir lu plusieurs
chapitres plus thoriques.
Nanmoins, je veux que vous soyez actifs ! Ne vous contentez pas de lire passivement mes explications, mme lorsque les
chapitres sont plutt thoriques ! Testez les codes et les manipulations au fur et mesure. Essayez les petites ides que vous
avez pour amliorer ou adapter lgrement le code. Sortez un peu des sentiers battus du tutoriel : cela vous fera pratiquer et vous
permettra de dcouvrir rapidement si vous avez compris ou non le chapitre.
Pas d'inquitude, si jamais vous bloquez sur quoi que ce soit qui n'est pas expliqu dans ce cours, la communaut qui sillonne
les forums saura vous apporter son aide prcieuse. Au passage, je tiens vous rappeler que la section "Commentaires" est
exclusivement destine aux commentaires et n'a pas pour vocation de regrouper les questions concernant ce tutoriel ; les forums
sont l pour a.
Dure dapprentissage
Il faut compter plusieurs semaines, voire plusieurs mois, pour atteindre un niveau solide, vous permettant de commencer faire
des choses srieuses plutt que de "bricoler". D'ailleurs merci de m'informer du temps que vous a pris la lecture de ce cours pour
que je puisse indiquer aux autres lecteurs une dure moyenne de lecture.
Composition du cours
Un lecteur attentif aura remarqu que le titre est "Apprenez programmer en C# sur .NET" (qui se prononce "Apprenez
www.openclassrooms.com
Partie 1 : Les fondamentaux 7/132
Alors, allez-vous apprendre le C# ou le .NET ? En fait, vous allez voir que l'un ne va pas sans l'autre :
C# : c'est le langage, la "langue" dans laquelle vous allez parler. Vous allez par exemple pouvoir dire "Ouvre une fentre
en haut gauche de l'cran".
.NET : ce sont les outils dont vous avez besoin pour travailler. C'est bien beau de parler, avec le langage, mais sans le
marteau et le tournevis pour mettre en place la fentre, vous ne feriez pas grand chose.
.NET est un ensemble de composants informatiques, que l'on appelle framework, qui vous permet d'avoir accs la
cration et manipulation de fentres, l'criture de fichiers, aux fonctionnalits rseau de la machine, la manipulation de
fichiers XML, etc.
Le tutoriel est loin d'tre fini, vous ne voyez donc pas toutes les parties. Voici ce que j'envisage, pour l'instant, de traiter :
Les fondamentaux
Notions importantes
Crer des applications riches en design avec WPF
Notions avances
Communiquer grce au rseau
Le dbut de ce cours sera plutt thorique. Pour savoir coder, il faut commencer par apprendre les bases du langage, c'est un
passage oblig.
Petit petit j'introduirai la pratique pour illustrer certains points importants ; cela vous permettra de mieux comprendre des
fonctionnements et surtout de bien mmoriser le cours.
Le code
Parce que c'est la norme chez la quasi-totalit des dveloppeurs professionnels, le code source que nous allons voir sera crit en
anglais. On prend l'habitude d'crire en anglais car le code peut ensuite facilement tre relu par des personnes d'autres
nationalits, anglophones ou non.
Imaginez qu'un espagnol souhaite corriger le code d'un allemand, et que le tout est relu par un franais... Si chacun crit dans sa
langue natale, cela donne quelque chose de vraiment horrible (a sent le vcu ).
Rassurez-vous ! Ce n'est pas parce que, dans le code source, la "fentre" sera appele "window" que ce cours sera plus difficile !
Toutes mes explications seront en franais, et les commentaires dans le code pour vous guider seront en gnral en franais.
J'ai fait le choix d'crire le code source en anglais pour vous habituer travailler avec du code anglais, car c'est ce que font les
programmeurs dignes de ce nom (pas que chez les professionnels d'ailleurs). Pas besoin d'tre un gnie en anglais pour lire et
crire du code dans cette langue.
Si vous avez vraiment du mal parler anglais, utilisez un dictionnaire ou des traductions en ligne. Vous y trouverez
forcment votre bonheur et ce n'est pas grave si vous ne faites pas des traductions parfaites, l'important c'est de
pouvoir tre compris par des gens qui ne parlent pas le franais.
On dit qu'il vaut mieux programmer en mauvais anglais qu'en bon franais, et c'est un conseil trs srieux !
En outre, je vous conseille de prendre les mmes habitudes d'criture que moi, aussi bien pour la mise en forme que pour la faon
de nommer les choses. Pourquoi ? Parce que coder c'est bien, mais coder proprement, c'est mieux. En fait, il s'agit de
conventions de codage respectes par "ceux qui savent programmer". Respecter ces conventions montre dj que vous n'tes
pas le premier venu qui crit n'importe quoi. Aprs assimilation de ce tutoriel, vous serez un vrai dveloppeur qui a des habitudes
de dveloppeur. Il vous sera ainsi plus facile de communiquer avec d'autres personnes.
De manire gnrale, je vous recommande de ne pas hsiter tester les codes que je prsenterai au fur et mesure. Surtout, si
vous avez des ides pour les amliorer un peu, faites-le ! a ne marchera pas tous les coups, mais cela vous fera beaucoup plus
www.openclassrooms.com
Partie 1 : Les fondamentaux 8/132
progresser que vous ne le pensez ! Ne comptez donc pas uniquement sur les TP pour pratiquer, ce serait vraiment dommage.
Sachez aussi que je suis ouvert toutes remarques, critiques, questions, insultes... portant sur ce tutoriel. N'hsitez donc pas
poster des commentaires, surtout si votre message peut tre utile pour d'autres personnes. Par contre, veuillez ne pas m'envoyer
de MP, sauf en cas de force majeure, parce que je n'aurai pas le temps de vous rpondre individuellement (la rdaction de ce
tutoriel en elle-mme ncessite dj beaucoup de temps), et que s'il s'agit d'une demande d'aide, les forums sont l pour a et on
vous y rpondra plus rapidement que moi.
Comment sont crs les programmes ?
Un programme : qu'est-ce que c'est ?
Comme vous le savez, votre ordinateur excute des programmes pour effectuer des tches. Vous utilisez des programmes tous les
jours :
Votre ordinateur ne peut excuter ces programmes que s'ils sont crits dans le seul langage qu'il comprend, le binaire :
Le processeur de votre ordinateur lit et comprend ce code, qui lui indique ce qu'il doit faire.
Mais... on ne va pas crire des programmes en binaire quand mme ?! C'est trop compliqu !
Bien sr que non. Personne n'crit srieusement des programmes directement en binaire. C'est, comme vous le dites, trop
compliqu. Voil pourquoi on crit les programmes dans des langages plus simples et plus "humains".
Il est en fait possible de "coder directement en binaire". a s'appelle l'assembleur. Les instructions sont trs basiques,
pour que le processeur les comprenne directement. Nanmoins, dans ce langage, il faut beaucoup de temps et d'efforts
pour faire quelque chose d'aussi simple qu'une calculatrice.
Code : Autre
Les instructions assembleur que vous voyez ci-dessus correspondent directement du binaire comme 00101111
01000101.
www.openclassrooms.com
Partie 1 : Les fondamentaux 9/132
Il existe des centaines de langages de programmation dont le but est de simplifier l'criture de ce code binaire/assembleur. En
effet, les langages que l'on utilise traditionnellement pour programmer, comme le C et le C++, nous permettent de crer des
programmes bien plus facilement qu'en assembleur (binaire).
Je vais vous expliquer rapidement le principe de fonctionnement des langages "traditionnels" comme le C et le C++, puis je vous
prsenterai le fonctionnement du C#. Comme le C# est plus rcent, on a pu amliorer son fonctionnement par rapport au C et au
C++ comme nous allons le voir.
Code : C
printf("Bonjour");
Ce n'est pas vraiment du franais, mais c'est quand mme beaucoup plus simple que le binaire ou l'assembleur vous avouerez !
Bien entendu, l'ordinateur ne comprend pas ces instructions. Lui, il veut du binaire, du vrai.
Pour obtenir du binaire partir d'un code crit en C ou C++, on doit effectuer ce qu'on appelle une compilation. C'est un
programme qui traduit le code source en binaire excutable :
Cette mthode est efficace et a fait ses preuves. De nombreuses personnes dveloppent toujours en C et C++ aujourd'hui.
Nanmoins, ces langages ont aussi un certain nombre dfauts dus leur anciennet. Par exemple, un programme compil
(binaire) ne fonctionne que sur la plateforme sur laquelle il a t compil. Cela veut dire que si vous compilez sous Windows,
vous obtenez un programme qui fonctionne sous Windows uniquement (et sur un type de processeur particulier). Impossible de
le faire tourner sous Mac OS X ou Linux simplement, moins de le recompiler sous ces systmes d'exploitation (et d'effectuer au
passage quelques modifications).
www.openclassrooms.com
Partie 1 : Les fondamentaux 10/132
Les programmes binaires ont ce dfaut : ils ne fonctionnent que pour un seul type de machine. Pour les dveloppeurs qui
crivent le code, c'est assez fastidieux grer.
La compilation en C# ne donne pas un programme binaire, contrairement au C et au C++. Le code C# est en fait transform dans
un langage intermdiaire (appel CIL, anciennement MSIL) que l'on peut ensuite distribuer tout le monde. Ce code, bien sr,
n'est pas excutable lui-mme, car l'ordinateur ne comprend que le binaire.
www.openclassrooms.com
Partie 1 : Les fondamentaux 11/132
Le code en langage intermdiaire (CIL) correspond au programme que vous allez distribuer. Sous Windows, il prend l'apparence
d'un .exe comme les programmes habituels, mais il ne contient en revanche pas de binaire.
Lorsqu'on excute le programme CIL, celui-ci est lu par un autre programme (une machine analyser les programmes, appele
CLR) qui le compile cette fois en vrai programme binaire. Cette fois, le programme peut s'excuter, ouf !
Cela offre beaucoup de souplesse au programmeur. Le code en langage intermdiaire (CIL) peut tre distribu tout le monde. Il
suffit d'avoir install la machine CLR sur son ordinateur, qui peut alors lire les programmes en C# et les compiler " la vole" en
binaire. Avantage : le programme est toujours adapt l'ordinateur sur lequel il tourne.
La CLR vrifie aussi la scurit du code ; ainsi en C du code mal pens (par exemple une mauvaise utilisation des
pointeurs) peut entraner des problmes pour votre PC, ce que vous risquez beaucoup moins avec le C#. De plus, la
CLR dispose du JIT debugger qui permet de lancer Visual Studio (le logiciel qui va nous servir faire des programmes)
si une erreur survient dans un programme .NET pour voir ce qui a caus cette erreur.
Cette complexit ralentit lgrement la vitesse d'excution des programmes (par rapport au C ou au C++), mais la diffrence est
aujourd'hui vraiment ngligeable par rapport aux gains que cela apporte. On parle de code manag.
Le langage C# et le framework .NET
Qu'est-ce que le langage C# ? Qui l'a cr ? Quel est le rapport avec .NET ? Et puis, qu'est-ce que c'est .NET ?
Le C# ressemble beaucoup au Java dont il est inspir, bien que les deux langages prsentent des diffrences notables. Il reprend
aussi certaines notions du C/C++ mais s'en dmarque sensiblement.
Seul, il ne sert pas grand chose. En effet, le langage a besoin d'une bote outils pour excuter facilement des actions
courantes, comme ouvrir un fichier, communiquer sur le rseau, ouvrir une fentre, rduire une fentre, accder une base de
donnes, etc.
Cette bote outils, que l'on utilise quasi-systmatiquement en C#, c'est le framework .NET. C'est un peu comme un norme
couteau suisse qui offre toutes les possibilits dont vous pouvez rver.
Ce framework .NET n'est pas forcment li au langage C#. Il est aussi possible de l'utiliser dans d'autres langages comme Visual
Basic (plus simple, pour les programmeurs occasionnels), J# (plus proche de Java pour les habitus de Java) ou encore F#
(langage fonctionnel).
www.openclassrooms.com
Partie 1 : Les fondamentaux 12/132
Tous ces mots techniques ne doivent pas vous effrayer, c'est normal de
ne rien y comprendre pour le moment.
Aperu historique
C'est Microsoft qui est l'origine du Les diffrentes couches du framework .NET.
projet .NET et de son langage C#. En Image 010.010.20100
2001, Anders Hejlsberg (le crateur du
langage Delphi), employ chez Microsoft,
cre le framework .NET (prononc comme "dotte nette") et son langage phare : le C# (crit C Sharp
et prononc comme "c charpe"). Les deux sont complmentaires, comme nous allons le voir plus
loin.
www.openclassrooms.com
Partie 1 : Les fondamentaux 13/132
Petite anecdote : savez-vous pourquoi le langage s'appelle le "C#" ? Au dpart, il y avait le C. Ensuite, le C++ est sorti ;
c'est un jeu de mots car ++ permet d'incrmenter une variable dans beaucoup de langages : un clin dil de
programmeurs pour indiquer que le C++ est la version amliore du C. Enfin, le C# est aussi un clin dil, car en
musique # signifie la note au-dessus ; donc C# est cens tre un cran au-dessus du C et du C++.
Paint .NET , diteur d'images gratuit entirement crit l'aide du framework .NET.
Image 010.010.20200
quoi ressemble le C# ?
Voici un code minimal qui affiche "Hello World!" :
Code : C#
using System;
www.openclassrooms.com
Partie 1 : Les fondamentaux 14/132
class Program
{
public static void Main()
{
Console.WriteLine("Hello World!");
}
}
Nous aurons l'occasion de comprendre ce que tout cela veut dire plus loin.
Voici un code un peu plus long et complet qui gre (en partie) l'affichage d'une fentre, pour vous faire une ide. Je ne vous
donne ce bout de code qu' titre illustratif l encore :
Code : C#
namespace WinFormsContentLoading
{
/// <summary>
/// Custom form provides the main user interface for the
program.
/// In this sample we used the designer to fill the entire form
with a
/// ModelViewerControl, except for the menu bar which provides
the
/// "File / Open..." option.
/// </summary>
public partial class MainForm : Form
{
ContentBuilder contentBuilder;
ContentManager contentManager;
/// <summary>
/// Constructs the main form.
/// </summary>
public MainForm()
{
InitializeComponent();
contentManager = new
ContentManager(modelViewerControl.Services,
contentBuilder.OutputDirectory);
www.openclassrooms.com
Partie 1 : Les fondamentaux 15/132
/// <summary>
/// Event handler for the Exit menu option.
/// </summary>
void ExitMenuClicked(object sender, EventArgs e)
{
Close();
}
/// <summary>
/// Event handler for the Open menu option.
/// </summary>
void OpenMenuClicked(object sender, EventArgs e)
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.InitialDirectory = contentPath;
if (fileDialog.ShowDialog() == DialogResult.OK)
{
LoadModel(fileDialog.FileName);
}
}
/// <summary>
/// Loads a new 3D model file into the ModelViewerControl.
/// </summary>
void LoadModel(string fileName)
{
Cursor = Cursors.WaitCursor;
if (string.IsNullOrEmpty(buildError))
{
// If the build succeeded, use the ContentManager
to
www.openclassrooms.com
Partie 1 : Les fondamentaux 16/132
Cursor = Cursors.Arrow;
}
}
}
Lequel choisir ?
Il existe une implmentation libre du .NET qui regroupe une grande partie de ses technologies : Mono. Il
permet de faire tourner les programmes .NET sous Linux. Mono dispose mme d'un IDE libre, MonoDevelop,
qui permet de coder en C# sous Windows, Mac OS et Linux.
Dans ce cours, nous utiliserons uniquement Visual Studio car la majorit des gens disposent de Windows et
qu' la base c'est l'IDE fait pour le .NET (il offre donc la possibilit de travailler avec toutes les technologies
Logo de Mono.
de cette plate-forme).
Image 010.010.30100
Une autre alternative Visual Studio est SharpDevelop, un IDE Open Source conu pour
dvelopper du .NET.
Par contre, il n'est disponible que pour Windows, au regret des utilisateurs de Mac OS X et de
Linux.
Logo de SharpDevelop.
Image 010.010.30101
Nous allons travailler avec la version anglaise de Visual Studio pour diffrentes raisons. La premire est que j'ai moi-
mme la version anglaise, il vous sera donc plus facile de suivre ce que je fais si vous voyez la mme chose que moi
l'cran ! Ensuite, sachez que si vous avez des problmes, tant donn que c'est un logiciel amricain, vous trouverez
plus de rponses vos questions dans les aides en anglais. Enfin, certaines traductions franaises ne sont pas trs
propices lorsqu'il s'agit de termes techniques.
www.openclassrooms.com
Partie 1 : Les fondamentaux 17/132
Cet ISO contient Microsoft Visual C# 2010 Express. Vous aurez besoin d'un mulateur pour accder au contenu de l'iso.
DAEMON Tools Lite fait l'affaire ; si vous n'avez pas d'mulateur, installez-le et lancez-le.
Avant toute chose, faites un clic-droit sur l'icne de DAEMON Tools Lite dans la barre des tches et cliquez sur
"Prfrences":
Cochez la case "Auto montage" (cf. image 010.010.30300) ; cela permet de remonter automatiquement les images montes avant
l'arrt de votre ordinateur. tant donn que l'installation de Visual Studio requiert un redmarrage, sans cette option une erreur se
produira au redmarrage : l'installeur ne pourra plus accder au disque virtuel.
www.openclassrooms.com
Partie 1 : Les fondamentaux 18/132
Montez une image avec l'ISO, ouvrez l'Explorateur Windows et lancez l'installeur du disque virtuel de Visual Studio.
Slectionnez Visual C# :
Avancez dans l'installation jusqu' voir l'image 010.010.30500. Cochez la case pour SQL Server 2008 . Il se peut que vous ayez
aussi une case pour Silverlight ; si c'est le cas laissez-la coche aussi (case absente sur l'image car sur mon PC Silverlight est
dj install).
www.openclassrooms.com
Partie 1 : Les fondamentaux 19/132
www.openclassrooms.com
Partie 1 : Les fondamentaux 20/132
Progression de l'installation.
Image 010.010.30600
Au bout d'un certain temps (pour ne pas dire un temps certain), l'installeur va vous demander de redmarrer votre PC :
www.openclassrooms.com
Partie 1 : Les fondamentaux 21/132
www.openclassrooms.com
Partie 1 : Les fondamentaux 22/132
Enregistrement du produit.
Image 010.010.30900
Cliquez sur "Obtain a register key online" pour enregistrer votre produit :
Cela va ouvrir une page web. Il faut que vous vous connectiez avec une Windows Live ID (adresse e-mail chez un service
Microsoft ; ex: toto@live.fr ou toto@msn.com ou encore toto@hotmail.fr devraient faire l'affaire). Vous devez prsent vous
farcir tout le formulaire d'enregistrement. Vous y tes malheureusement obligs si vous voulez pouvoir utiliser Visual C#
Express autant que vous voudrez.
Entrez une adresse e-mail valide car un e-mail vous sera envoy pour continuer.
www.openclassrooms.com
Partie 1 : Les fondamentaux 23/132
Vous allez recevoir votre cl d'enregistrement par e-mail. Dans certains e-mails, on vous donne aussi une cl pour essayer Visual
Studio Pro, mais nous n'en avons pas besoin.
Dans Visual Studio, cliquez nouveau sur "Help" > "Register Product". Vous voyez la mme fentre que tout l'heure.
Entrez votre cl et cliquez sur "Register Now". Si tout s'est pass correctement, vous voyez a :
Enregistrement dj ralis.
Image 010.010.31100
Et voil, l'installation est finie. Maintenant, faisons un petit tour d'horizon de votre nouvel IDE.
Tour d'horizon de Visual C# Express 2010
Allure gnrale
Ce n'est pas trs compliqu d'apprendre se servir de Visual Studio alors je vais vous dire les grandes lignes.
Vous devez avoir quelque chose qui ressemble a :
www.openclassrooms.com
Partie 1 : Les fondamentaux 24/132
Il se peut que vous n'ayez pas tout fait la mme chose que moi. Comme vous pouvez le voir, certaines fentres
bnficient d'un bouton "auto hide", qui permet de les cacher automatiquement sur le ct. Lorsqu'une fentre est
cache, seul son nom est visible sur le ct o elle est normalement. Quand vous passez la souris sur le nom, la fentre
apparat. Si vous enlevez la souris de la fentre, cette dernire se cache nouveau. Ici, j'ai tout dvoil pour que vous
voyez quoi a ressemble.
Fonctionnement
Le code d'un programme est plac dans des fichiers. Ces fichiers sont rangs dans des projets qui eux-mmes font partie d'une
solution. La solution est le plus grand "conteneur".
Bonus
Une autre raison pour laquelle j'ai choisi de travailler avec Visual Studio est que cet IDE fournit des fonctionnalits trs
intressantes puisqu'elles nous simplifient le travail.
Le compilateur
Le compilateur vrifie la syntaxe de votre code. Si votre code est crit correctement, le compilateur le convertit pour qu'il puisse
par la suite tre excut. Tant que votre programme n'est pas converti en CIL, il ne peut pas tre utilis.
Vous pourriez avoir un autre compilateur, mais tant donn que Visual Studio en intgre dj un, ne nous compliquons pas la vie
!
Pour compiler votre solution, cliquez sur "Debug" > "Build Solution" (F6 sur les nouvelles versions et Ctrl + Shift + B sur les
anciennes).
Le debugger
J'imagine que vous savez ce qu'est un bug : c'est une erreur dans un programme. Faire du debug correspond donc traquer ces
erreurs. Pour cela, on utilise un debugger ; il permet de lancer votre programme en mode test. C'est indispensable pour dnicher
la plupart des bugs. En cas d'erreur, vous tes avertis et on vous montre l'erreur, ce n'est pas comme quand une application
crashe et qu'on doit soudainement fermer le programme.
Pour ce faire, cliquez sur "Debug" > "Start Debugging" (F5).
Pour afficher la barre d'outils pour le debug, cliquez sur "View" > "Toolbars" et assurez vous que "Debug" est slectionn.
Normalement, vous avez dans votre barre d'outils des boutons semblables des boutons de lecture :
www.openclassrooms.com
Partie 1 : Les fondamentaux 25/132
Start Debugging (en mode normal) : pour lancer le programme en mode debug. Continue (en mode debug): pour
continuer le code jusqu'au point d'arrt suivant. S'il n'y en a plus, le programme continue sans s'arrter.
Stop Debugging : pour faire stop (en mode debug).
Show Next Statement : lorsque vous avez fait pause, cela permet de vous resituer la ligne de code qui s'apprte tre
excute.
Step Into (F11) : excute le code en s'arrtant chaque ligne et en rentrant dans les fonctions appeles sur la ligne, si
possible.
Step Over (F10) : excute le code en s'arrtant chaque ligne.
Step Out (Shift + F11) : excute tout le code du bloc courant et s'arrte.
Les deux derniers boutons sont inutiles pour nous.
Dans votre code, vous pouvez mettre des points d'arrt (breakpoints) sur une ligne. Lorsque cette ligne s'apprte tre
excute, le programme passe en pause et dans Visual Studio vous pouvez voir la valeur de vos variables.
Pour mettre un point d'arrt, appuyez sur F9 quand le curseur est sur une ligne. Vous pouvez aussi cliquer gauche d'une ligne :
gauche de son numro et dans la partie lgrement plus grise. Par dfaut, les numros de lignes ne sont pas affichs. Pour les
afficher, allez dans "Tools" > "Options", cochez la case "Show all settings" tout en bas gauche de la nouvelle fentre, ouvrez
ensuite le nud "Text Editor", cliquez sur "All languages" et cochez la case "Line numbers" dans la section "Display" droite :
Lorsque vous crirez du code, vous devrez mettre vos points d'arrt avant de lancer le debug.
www.openclassrooms.com
Partie 1 : Les fondamentaux 26/132
La petite infobulle en-dessous indique que la variable myString vaut null. Elle ne vaut pas encore "Hello world!" car
le point d'arrt met en pause le programme avant l'excution de la ligne.
L'IntelliSense
Lorsque vous commencez crire quelque chose, Visual Studio vous propose automatiquement la fin de votre mot grce
l'IntelliSense.
Pour dclencher l'IntelliSense manuellement (si a ne se fait pas dj tout seul), appuyez sur Ctrl + Espace. Exemple :
L'IntelliSense luvre.
Image 010.010.40400
Que diriez-vous d'entrer dans le vif du sujet ? On attaque ds le prochain chapitre !
www.openclassrooms.com
Partie 1 : Les fondamentaux 27/132
La console va nous permettre d'afficher des chanes de caractres. Nous allons commencer avec elle pour avoir un rendu visuel
de ce que fait le code.
Cration de la solution
Comme dit prcdemment, la solution est ce qui va contenir notre programme. Une solution est faite de projets, qui contiennent
chacun des fichiers de code, et des rfrences pour charger les assemblies. Pour faire simple, une assembly contient du code
dj crit et peut donc tre appele pour offrir ses services.
Nous allons crer une nouvelle solution ; celle-ci contiendra dj un projet et des rfrences vers les assemblies de base (en
l'occurrence de quoi utiliser la console).
D'abord, lancez Visual Studio et cliquez dans la barre des menus sur "File" > "New Project". Vous devriez avoir a :
Ce n'est pas tout fait ce que nous voulons, il manque des dtails.
www.openclassrooms.com
Partie 1 : Les fondamentaux 28/132
www.openclassrooms.com
Partie 1 : Les fondamentaux 29/132
vous pouvez choisir o enregistrer votre solution en cliquant sur Browse... (Parcourir...) ;
vous pouvez donner un nom votre solution et au premier projet qu'elle va contenir.
Donnez un nom votre solution et votre projet et cliquez sur OK quand vous tes prts. Voici maintenant ce que vous voyez :
Pour tester du code, mettez-le entre les deux accolades du bloc Main (sauf mention contraire de ma part).
Nous allons utiliser une mthode dj cre qui va afficher du texte dans la console, c'est WriteLine. Cette mthode se situe
dans la classe Console, donc pour y accder il faut crire Console.WriteLine. Vous aurez plus d'explications quand nous
verrons les classes et vous pourrez ainsi mieux comprendre. Pour l'instant, regardez comment a fonctionne dans l'exemple
suivant. Console.WriteLine("Hello World!"); affiche Hello World! en console, donc pour tester, crivez :
Code : C#
using System;
namespace MyFirstApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
www.openclassrooms.com
Partie 1 : Les fondamentaux 30/132
Si vous ne lancez pas le programme depuis la console, la fentre se ferme ds que le programme est termin. Pour la
laisser ouverte et pouvoir lire ce qui est affich, crivez Console.Read(); la fin du bloc Main.
Pour fermer la console et terminer le programme, appuyez sur une touche ou fermez directement la fentre de la console.
Lancement depuis l'invite de commandes (console)
Pour gnrer votre application (pour qu'elle soit compile et convertie en .exe), cliquez sur "Debug" > "Build Solution" (F6 sous
les nouvelles versions de Visual Studio, Ctrl + Shift + B sous les anciennes). Le volet "Output" s'ouvre et vous devez voir
quelque chose comme :
"1 succeded" m'indique qu'un projet a bien t compil. Notez que vous tes aussi informs si une erreur survient.
Je vais maintenant vous apprendre lancer cet excutable, non pas depuis l'explorateur, mais depuis la console. La console doit
se trouver l : C:\Windows\System32\cmd.exe. Je vous conseille d'en faire un raccourci sur votre bureau car nous allons en
avoir besoin assez souvent. Lancez cet excutable (qui est l'invite de commandes), et vous voyez :
www.openclassrooms.com
Partie 1 : Les fondamentaux 31/132
La console Windows.
Image 020.010.30100
Copiez l'adresse de votre application jusqu'au dossier "Debug". Pour moi c'est "C:\Users\Narvarth\Documents\Visual Studio
2008\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug".
crivez cd , laissez un espace, et collez l'adresse.
Autre chose, dans la console l'espace est utilis pour sparer les arguments. De ce fait, si votre adresse comporte des
espaces, la console croira recevoir plusieurs arguments. Pour indiquer qu'il s'agit d'un seul et mme bloc, il vous faut
entourer l'adresse avec des guillemets (comme c'est le cas sur mon impression d'cran).
"cd" signifie "change directory" (changer de dossier) : on se tlporte dans le dossier o se trouve notre programme.
Tapez ensuite le nom de votre solution suivi de ".exe" et appuyez sur Entre. Il ne va rien se passer car le programme ne fait rien.
Voici ce que a donne chez moi :
www.openclassrooms.com
Partie 1 : Les fondamentaux 32/132
Si vous avez lanc votre programme depuis la console et qu'une erreur survient, il va planter et vous devrez le terminer.
Pour viter cela et pour voir ce qui a caus l'erreur, lancez le programme en mode debug. Pour ce faire, cliquez sur
"Debug" > "Start Debugging" (F5).
Voil, maintenant que vous savez un peu travailler avec la console, vous allez pouvoir tester le code que je vous donne.
www.openclassrooms.com
Partie 1 : Les fondamentaux 33/132
Les variables
Une des questions qu'un dbutant peut se poser est :
Que fait un programmeur quand il crit du code ?
Les deux lments essentiels d'une variable sont sa valeur (et donc son type) et son nom. Nous parlerons des types juste aprs.
Le nom, c'est vous qui le fixez ; il est unique et permet de n'identifier qu'une seule variable. La valeur, quant elle, peut tre peu
prs n'importe quoi, et peut tre modifie autant que l'on veut. Pour schmatiser, la variable est la bote, son nom est crit dessus,
sa valeur est ce qu'elle contient, et son type est la forme de la bote.
le nom d'une variable est obligatoirement crit avec des caractres alphanumriques (de prfrence sans accent), ainsi
que le underscore '_' (sans les apostrophes) :
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789 ;
le nom doit forcment commencer par une lettre (underscore '_' compris) ;
le nom ne doit pas tre le nom d'un type ou d'une classe dj dfinis, d'un mot-clef du langage, ...(il ne doit pas tre dj
pris). Bref, il ne faut pas que la confusion soit possible.
C# fait la diffrence entre majuscules et minuscules (on dit que ce langage est case sensitive), donc les variables test et
TEST sont diffrentes.
Le C# dispose de types de base qui permettent de reprsenter des informations dont la nature est courante, comme des nombres,
des caractres et des chanes de caractres. Il existe un nombre infini de types tant donn que l'on peut construire un nouveau
type partir de ceux qui existent dj. C'est ce que nous verrons quand nous tudierons les classes.
Taille en mmoire
Type C# Type .NET Signification Domaine de valeurs
(en octets)
caractre Unicode (UTF-16) allant de
char Char character (caractre) 2
U+0000 U+ffff
www.openclassrooms.com
Partie 1 : Les fondamentaux 34/132
Chacun des types C# prsents est un alias du type .NET associ, cela signifie que lorsque que vous crivez par exemple int,
c'est comme si vous aviez crit System.Int32. Pour raccourcir et par habitude, on privilgie le type C# au type .NET.
Code : C#
int i = 10;
string s = "Hello world!";
char c = 'a';
...affichera :
Code : Console
www.openclassrooms.com
Partie 1 : Les fondamentaux 35/132
Conventions d'criture pour le typage des donnes crites "en dur" dans le code
Dans votre code, vous pouvez directement entrer des valeurs affecter aux variables. La question qui se pose est : de quel type
sont les donnes entres ? En effet, par exemple le chiffre 2 doit-il tre compris comme un int, un uint, un double, ... ? Pour
pallier ce problme, des conventions ont t tablies.
Un nombre entier est considr comme un int s'il tient dans la plage de valeurs d'un int (exemple : -123), et comme un long
s'il ne tient pas dans la plage de valeurs d'un int mais dans celle d'un long (exemple : 5111222333).
Un nombre crit avec un u la fin symbolise un uint. Exemple : 2u (ou 2U).
Un nombre crit avec un l la fin symbolise un long. Exemple : 2l (ou 2L).
Un nombre crit avec ul la fin symbolise un ulong. Exemple : 2ul (ou 2UL).
Un nombre crit avec une partie dcimale, ou avec un d la fin symbolise un double. Exemple : 2.0 ou 2d (ou 2D).
Un nombre crit avec un f la fin symbolise un float. Exemple : 2.0f ou 2f (ou 2F).
Un nombre crit avec un m la fin symbolise un decimal. Exemple : 2.0m ou 2m (ou 2M).
D'autre part, les guillemets (") servent encadrer une chane de caractres et les apostrophes (') servent encadrer un
caractre.
Exemple : "Bonjour tout le monde" et 'B'.
Utiliser des variables
Dclaration
Pour utiliser une variable, il faut d'abord la dclarer (la crer) : on rserve une partie de la mmoire pour cette variable. On
spcifie ce qu'elle reprsentera (un entier, un caractre, une image, ...) en indiquant son type.
La syntaxe est : type nom;
Faites attention ne pas oublier le point-virgule, sans quoi Visual Studio ne pourra pas compiler votre code.
En C/C++, une fois dclare, la variable dispose d'un emplacement en mmoire et elle vaut ce qui s'y trouve. Ainsi, juste
aprs la cration d'un entier, vous ne savez pas ce qu'il vaut ; cela peut tre 987 comme 123456789. En C#, il faut
absolument prciser la valeur d'une variable aprs l'avoir dclare. En fait, il y a des cas o ce n'est pas oblig, mais ne
vous en occupez pas pour l'instant.
Code : C#
Le compilateur vous dit "Use of unassigned local variable 'myInt' ". En fait, le compilateur crie parce qu'il ne sait pas ce que doit
valoir notre entier. Il faut donc que vous lui donniez une valeur, par exemple :
Code : C#
www.openclassrooms.com
Partie 1 : Les fondamentaux 36/132
{
int myInt = 255;
Console.WriteLine(myInt);
}
Comme je vous le disais, vous n'tes pas toujours contraints spcifier de valeur : dans certains cas, c'est la valeur par dfaut
qui est automatiquement utilise. Nous tudierons cela dans le chapitre sur les classes, mais a ne fait pas de mal d'apprendre
ds maintenant les valeurs par dfaut :
la valeur par dfaut de tout type numrique est 0, adapt au type (0.0 pour un float ou un double) ;
la valeur par dfaut d'une chane de caractres (string) est null, et non pas la chane vide, qui est reprsente par
string.Empty ou encore "" ;
la valeur par dfaut d'un caractre (char) est '\0'.
Code : C#
int myInteger;
myInteger = 3;
Voici comment crer une chane de caractres valant "Hello world!" et un caractre ("char" signifie "caractre" en anglais)
valant 'a' :
Code : C#
Type valeur
Une variable de type valeur contient directement l'information. Cela signifie que lorsque cette variable est modifie, la valeur
qu'elle contenait est aussi modifie.
Cela ne m'a pas paru indispensable de vous apprendre crer des structures, par contre il faut que vous connaissiez des
structures lmentaires. Les types numriques de base sont des structures, donc se comportent comme des types valeur. Le type
string est un peu spcial : c'est une classe, mais elle se comporte comme un type valeur.
Type rfrence
Une variable de type rfrence contient l'adresse de l'emplacement mmoire o se trouve l'information. Du coup, une variable qui
a la mme rfrence qu'une seconde variable peut tre automatiquement change quand la seconde variable est modifie.
www.openclassrooms.com
Partie 1 : Les fondamentaux 37/132
Nous verrons tout cela bien plus en dtail avec les classes. Je voulais juste introduire cette notion car c'est quelque chose de
fondamental et je pense que plus c'est pris tt, plus vous aurez le temps d'y revenir petit petit pour bien cerner le concept.
Les numrations
Une numration est une liste de valeurs qui a un type unique. Ce type est le nom de l'numration.
Un exemple vaut toujours plus qu'un long discours donc voyez plutt comment dclarer une numration dsignant les
diffrents temps (dans l'ordre : inconnu, ensoleill, nuageux, pluvieux) :
Code : C#
enum Weather
{
Unknown,
Sunny,
Cloudy,
Rainy
}
Chaque valeur doit tre suivie d'une virgule, sauf la dernire pour laquelle ce n'est pas oblig (mais vous pouvez quand mme le
faire ; par contre, c'est moche ).
Vous pouvez aussi mettre un point-virgule aprs l'accolade fermante, mais ce n'est pas ncessaire pour la compilation.
Une fois que cela est fait, vous pouvez dclarer une variable de type Weather comme suit :
Code : C#
Si vous ne faites que dclarer la variable, sans l'initialiser, elle prendra automatiquement la premire valeur.
Ainsi, Weather todaysWeather; correspond ici Weather todaysWeather = Weather.Unknown;.
Ce n'est pas dit que vous ayez toujours besoin des numrations, mais sachez qu'elles sont trs utiles quand mme. Vous verrez
des exemples dans la 2e partie.
Vous ne pouvez pas mettre des numrations o vous voulez. Une numration se dclare en tant que membre d'une
classe (ou en-dehors d'une classe), et non pas dans une mthode. Nous verrons ce que signifient "membre" et
"mthode" dans le chapitre sur les classes, mais regardez ds prsent l'exemple qui suit pour comprendre :
Code : C#
namespace ConsoleApplication1
{
class Program
{
enum Weather
{
Unknown,
Sunny,
Cloudy,
Rainy
}
www.openclassrooms.com
Partie 1 : Les fondamentaux 38/132
a y est, vous savez ce que sont les variables. Retenez bien qu'il faut d'abord les dclarer, puis les initialiser, pour les utiliser.
www.openclassrooms.com
Partie 1 : Les fondamentaux 39/132
Les oprateurs
Dans la quasi-totalit des cas, les oprateurs servent effectuer des oprations avec des variables qui sont de mme
type.
Par exemple, comment voulez-vous comparer une image et un nombre ? Ce n'est pas faisable, nous sommes d'accord.
Les oprateurs mathmatiques
Ils s'utilisent sur des variables qui reprsentent en gnral des nombres.
Le +
Code : C#
int myInt = 1 + 1;
Code : C#
Dans le code string s = "nombre converti en chane de caractres : " + 4;, le nombre 4
est automatiquement converti en une chane de caractres qui est mise la suite de la 1re.
Le -
Code : C#
int myInt = 3 - 4;
Cela n'aurait pas march avec un uint car un uint n'est pas sign : il est forcment positif .
Le *
Il sert effectuer une multiplication.
Code : C#
int myInt = 2 * 3;
www.openclassrooms.com
Partie 1 : Les fondamentaux 40/132
Le /
Si les deux oprandes sont des entiers, le rsultat est le quotient entier.
Code : C#
int myInt = 5 / 2;
Code : C#
double d = 5.0 / 2;
Aprs excution, d vaut 2.5. Le fait d'avoir mis un point (qui correspond en franais une virgule) indique que l'on ne veut pas
traiter avec des entiers. 2 est bien un entier mais est, ici, automatiquement converti pour que l'opration fonctionne.
Le %
Il permet d'obtenir le reste d'une division euclidienne : si a = b*q + r, avec 0 <= r < q, alors a % b vaut r.
Code : C#
Comme dit prcdemment, vous n'tes pas obligs d'utiliser des valeurs fixes. Vous pouvez donc crire :
Code : C#
int i = 5;
int j = i + 7;
Simplifications d'criture
Il est possible (et prfrable) d'crire :
i += 5; la place de i = i + 5;
i -= 5; la place de i = i - 5;
i *= 5; la place de i = i * 5;
i /= 5; la place de i = i / 5;
i %= 5; la place de i = i % 5;
www.openclassrooms.com
Partie 1 : Les fondamentaux 41/132
Pour simplifier au maximum votre code, plutt que d'crire i = i + 1; ou i += 1; crivez i++;
Cette simplification n'est valable que pour les oprateurs + et - (i--; la place de i -= 1;).
En C#, ils permettent de comparer deux boolens. Le terme "boolen" vient de George Boole, mathmaticien anglais qui on doit
l'algbre de Boole : thories mathmatiques sur les comparaisons d'assertions (une assertion est une proposition pouvant tre
soit vraie, soit fausse).
En termes binaires:
0 correspond false (faux)
1 correspond true (vrai)
Les oprateurs sont reprsents par des symboles (ici entre parenthses). Dans le code vous devez imprativement utiliser les
symboles et non pas le nom des oprateurs.
NOT ( !)
Cela n'a rien voir avec n! qui signifie "factorielle n". n! = n*(n-1)*(n-2)* ... 2*1 avec n >= 0 (0! = 1)
AND ( &&)
Oprandes Rsultat Les deux oprandes doivent valoir true pour que le rsultat soit true.
0 AND 0 = 0
false false false 0 AND 1 = 0
1 AND 0 = 0
false true false 1 AND 1 = 1
true false false
D'un point de vue lectronique, on peut crire "+" la place de "OR" et "." (point de la
true true true multiplication) la place de "AND". Vous pouvez regarder des articles sur l'algbre de Boole pour
apprendre matriser les oprateurs logiques.
OR ( ||)
Oprandes Rsultat Un au moins des deux oprandes doit valoir true pour que le rsultat soit true.
0 OR 0 = 0
false false false 0 OR 1 = 1
1 OR 0 = 1
false true true 1 OR 1 = 1
www.openclassrooms.com
Partie 1 : Les fondamentaux 42/132
XOR ( ^)
Oprandes Rsultat C'est un ou exclusif : pareil que pour OR mais si les deux sont true, le rsultat sera false.
0 XOR 0 = 0
false false false 0 XOR 1 = 1
1 XOR 0 = 1
false true true 1 XOR 1 = 0
true false true Autres oprateurs
true true false L'oprateur d'affectation
Le =
int myInt; Un espace mmoire est allou pour stocker la valeur de myInt. cet instant myInt n'a pas de valeur.
(lignes intermdiaires)
myInt = 2; La valeur de myInt est modifie. myInt vaut prsent 2.
Pour faire une assignation (=affectation), on peut aussi utiliser une autre variable ; la syntaxe est alors :
variableModifier = autreVariable;
En fait cela dpend. Si les variables sont de type valeur, on rcupre la valeur de autreVariable et on l'crit en mmoire l
o est stocke variableModifier.
Si autreVariable ne contient pas une valeur mais une rfrence, alors les deux variables variableModifier et
autreVariable vont rfrencer le mme objet.
Aprs l'affectation variableModifier = autreVariable;, si l'une des deux variables est modifie, l'autre le sera
donc aussi.
Il retourne true si les deux oprandes sont gaux et false si ce n'est pas le cas.
Code : C#
L'absence de parenthses ne provoque pas d'erreur, mais autant les mettre car cela rend votre code plus lisible.
www.openclassrooms.com
Partie 1 : Les fondamentaux 43/132
Oprateur !=
Il retourne true si les deux oprandes sont diffrents et false si ce n'est pas le cas.
Code : C#
Oprateurs d'ingalits
< (infrieur)
<= (infrieur ou gal)
> (suprieur)
>= (suprieur ou gal)
Voici un exemple :
Code : C#
Aprs excution, myString vaut "les nombres ne sont pas gaux" car (2 == 5) a retourn false.
Mmorisez bien tous ces hiroglyphes car vous en aurez tout le temps besoin !
www.openclassrooms.com
Partie 1 : Les fondamentaux 44/132
La route me semble tre une bonne analogie. Il n'y a pas qu'un seul chemin emprunter pour se rendre un endroit. Suivant le
lieu o vous dsirez vous rendre, vous n'allez pas faire la mme chose. Eh bien ici c'est pareil !
if et sa famille
if
"if" est un mot anglais qui signifie "si". C'est un mot-clef du langage C# qui permet de n'effectuer du code que dans certaines
conditions.
La syntaxe est la suivante :
Code : C#
if (condition)
{
// Code excuter si la condition est satisfaite.
}
condition est une expression qui retourne un boolen : soit true, soit false :
Vous remarquerez au passage que j'ai mis deux slashes (slash = barre oblique : //) entre les accolades. Cela permet de
mettre en commentaire ce qui se trouve leur droite, et ce sur une ligne seulement.
Pour mettre des commentaires sur plusieurs lignes, utilisez /* pour commencer le bloc de commentaires et */ pour le
finir.
Les commentaires sont ignors lors de l'excution : ils servent juste aux personnes qui lisent le code.
Commenter judicieusement son code est un travail subtil. Il faut savoir expliquer ce qui est susceptible de ne pas tre compris par
un relecteur, tout en ne tombant pas dans l'excs (c'est--dire ne pas commenter chaque ligne, ou du code basique).
else if
"else if" veut dire "sinon, si". Plac aprs un if, il permet d'excuter du code qui ne remplit pas la premire condition, mais la
deuxime.
La syntaxe est la suivante :
Code : C#
if (condition1)
{
// Code excuter si la condition est satisfaite.
}
else if (condition2)
{
// Code excuter si la premire condition n'est pas satisfaite
mais que la deuxime l'est.
}
www.openclassrooms.com
Partie 1 : Les fondamentaux 45/132
else
"else" signifie "sinon". Plac aprs un if simple, ou un if et un (ou plusieurs) else if, il permet d'excuter le code qui ne
satisfait aucune condition prcdente.
La syntaxe est la suivante :
Code : C#
if (condition)
{
// Code excuter si la condition est satisfaite.
}
else
{
// Code excuter si la premire condition n'est pas satisfaite.
}
Les trois expressions peuvent se combiner. Voici un exemple o age est un entier reprsentant l'ge d'un client un restaurant :
Code : C#
if (age < 4)
{
// gratuit
// 0 < age < 4
}
else if (age < 12)
{
// Tarif enfant
// 4 <= age < 12
// en effet, age n'est pas strictement infrieur 4, et est
strictement infrieur 12.
}
else if (age < 18)
{
// Tarif ado
// 12 <= age < 18
}
else
{
// Tarif adulte
// 18 <= age
}
// suite du code
switch : un if spcial
Il permet de remplacer if et sa famille pour tudier l'galit de plusieurs termes.
Code : C#
if (level == 1)
{
// niveau 1
}
else if (level == 2)
{
// niveau 2
}
www.openclassrooms.com
Partie 1 : Les fondamentaux 46/132
else
{
// autre niveau
}
Code : C#
switch (level)
{
case 1:
{
// niveau 1
}
break;
case 2:
{
// niveau 2
}
break;
default:
{
// autre niveau
}
break;
}
Les break servent clturer les case : si vous n'en mettez pas, le code du case suivant sera aussi excut. Par
contre le break est obligatoire ds qu'un bloc case contient du code.
default est le cas par dfaut. Il est excut seulement si aucun case ne convient.
while
Les boucles conditionnelles permettent de rpter des actions tant que certaines conditions sont satisfaites. Ds lors que ces
dernires ne le sont plus, le programme "sort de la boucle" et excute le code qui suit.
while
Code : C#
while (condition)
{
// Code qui s'excute tant que la condition est satisfaite.
}
Il peut arriver que vous ayez besoin de sortir prmaturment d'un boucle. Pour ce faire, utilisez break comme dans
l'exemple suivant o condition et needToExit sont des boolens :
Code : C#
www.openclassrooms.com
Partie 1 : Les fondamentaux 47/132
while (condition)
{
if (needToExit)
{
break;
}
Une fois que break est excut, plus aucune ligne de code l'intrieur des accolades de la boucle n'est excute. Ainsi la ligne
qui s'excute aprs le break est celle situe juste aprs l'accolade fermante.
Puisqu'un exemple permet toujours de mieux comprendre, je vous propose un bout de code pour faire un compte rebours qui
dbute 100 :
Code : C#
int i = 100;
while (i > 0)
{
// On dcrmente i
i--;
}
do ... while
L'quivalent franais serait "fait ... tant que". Cela permet d'excuter les instructions une premire fois obligatoirement, et de
rpter l'excution si besoin est.
La syntaxe est :
Code : C#
do
{
// Code qui s'excute une 1re fois obligatoirement et ensuite en
boucle tant que la condition est satisfaite.
}
while (condition);
Vous pouvez l encore utiliser break au sein du bloc dlimit par les accolades.
for
C'est un while compact.
Code : C#
int i;
for (i = 100; i > 0; i--)
{
}
www.openclassrooms.com
Partie 1 : Les fondamentaux 48/132
Code : C#
Dans ce cas, tant donn que i est dclar dans le for, il ne sera accessible qu'entre ces deux accolades. En effet, une
variable dclare dans un bloc (ce qui est dlimit par deux accolades) est uniquement accessible l'intrieur de ce
bloc. Ainsi, si je cre un entier l'intrieur d'un bloc if, cet entier ne sera utilisable que dans ce if.
continue
la diffrence de break;, continue; ne s'utilise pas pour terminer la boucle, mais pour passer directement l'lment
suivant. Voici sans plus attendre un exemple, qui vous apportera plus qu'un long discours :
Code : C#
Code : Console
9
10
Notez bien que la boucle ne s'arrte pas, seules les instructions relatives l'lment en cours ne sont plus excutes.
Les tests de conditions sont vraiment trs courants ils sont prsents mme dans les morceaux de code les plus simples. Ce
chapitre est donc un incontournable de plus !
www.openclassrooms.com
Partie 1 : Les fondamentaux 49/132
Les mthodes
Les mthodes (aussi appeles "fonctions" dans de nombreux langages) sont l pour nous simplifier la vie : plutt que de mettre
tout le code la suite, on structure notre programme en crant des mthodes.
Une mthode est une suite d'instructions regroupes sous un nom ; elle prend en entre des paramtres et retourne un rsultat.
Notez qu'une mthode peut ne prendre aucun paramtre en entre ou ne retourner aucun rsultat.
Les mthodes ont de nombreux avantages. Le premier est sans doute de ne pas avoir rcrire beaucoup de lignes de code
chaque fois qu'on veut faire une certaine opration. Cela permet aussi de rajouter un aspect dynamique au code : suivant les
paramtres passs, le rsultat retourn n'est pas le mme.
Crer une mthode
Voici la syntaxe pour une mthode prenant deux paramtres en entre et ne retournant rien :
Code : Autre
Voici la syntaxe pour une mthode ne prenant aucun paramtre en entre et retournant xxx (xxx tant une variable) :
Code : Autre
typeDuRsultat nomDeLaMthode()
{
// Code excuter quand la mthode est appele.
return xxx;
}
void veut dire "vide", "dpourvu de", ... Quand une mthode ne retourne rien, le type de retour est donc void.
Une chose trs importante est de bien choisir le nom pour sa mthode. Une mthode correspond une action, donc un
verbe lui correspond bien. Prenez donc l'habitude de choisir des verbes anglais pour vos mthodes. Par exemple, une
mthode qui trie un tableau peut tre nomme SortArray tant donn que "to sort" veut dire "trier", et qu'un array
est un tableau.
Besoin d'exemples ?
Pas de soucis ! Crons une mthode qui multiplie un nombre x par un nombre y (nous allons travailler avec des entiers). Voici
comment faire :
Code : C#
Nous allons utiliser une mthode dj cre qui va afficher du texte dans la console, c'est WriteLine. Cette mthode se situe
dans la classe Console, donc pour y accder il faut crire Console.WriteLine. Vous aurez plus d'explications quand nous
verrons les classes et vous pourrez ainsi mieux comprendre. Pour l'instant, regardez comment a fonctionne dans les
exemples suivants.
www.openclassrooms.com
Partie 1 : Les fondamentaux 50/132
Voici une autre mthode, qui affiche un Hello World! dans le cadre "Output" de Visual Studio si vous avez un programme
avec des fentres (par exemple des WinForms), et dans la console dans le cas contraire.
Rappel : la console, plus connue sous le nom d'diteur de commandes, est la fentre o du code est crit en gnral en vert sur
fond noir.
Code : C#
void SayHello()
{
Console.WriteLine("Hello world!");
}
Vous noterez la magnifique transition vers l'appel d'une mthode. Eh oui, Console.WriteLine("Hello world!"); est
bien un appel une mthode !
Appeler une mthode
Console.WriteLine("Hello world!"); est un appel la la mthode WriteLine, laquelle nous passons en
paramtre une chane de caractres qui vaut "Hello world!".
Console est une classe dans laquelle est dfinie la mthode WriteLine. Ne nous attardons pas sur ce point qui fera l'objet
d'explications dtailles dans la suite de cette 1re partie thorique.
Code : C#
int number1 = 3;
int number2 = 2;
int number3 = Multiply(number1, number2);
Console.WriteLine(number3);
number1 et number2 sont valus : on va rcuprer en mmoire leur valeur, que l'on passe la mthode. La mthode fait le
calcul et renvoie le rsultat (ici 6). L'expression Multiply(number1, number2) est donc value comme un entier valant
6. Ensuite on fixe la valeur de number3 6.
Code : C#
Console.WriteLine(Multiply(3, 2));
Par dfaut, les paramtres des mthodes sont toujours passs par valeur. Cela signifie qu'une copie de la valeur de chaque
paramtre est faite au moment de l'appel et ce sont ces copies qui sont utilises dans le corps de la mthode : les variables
transmises la mthode ne peuvent donc pas tre modifies par celle-ci. Si vous modifiez ces valeurs dans le corps de la
mthode, les modifications seront perdues la fin de son appel.
En ralit ce comportement n'a rien de sorcier : c'est exactement ce qui se passe lorsque vous initialisez une variable partir d'une
autre variable. La valeur est copie au moment de l'initialisation, puis les deux variables vivent leur vie indpendamment. Voici un
exemple rapide pour le prouver :
Code : C#
// On modifie myOtherInt.
myOtherInt = 5;
Console.WriteLine("myInt = " + myInt);
Console.WriteLine("myOtherInt = " + myOtherInt);
Code : Console
myInt = 100
myOtherInt = 100
myInt = 100
myOtherInt = 5
Les paramtres transmis la mthode (ceux qui sont copis) sont appels paramtres effectifs.
Les paramtres utiliss dans le corps de la mthode (ceux qui reoivent la copie) sont appels paramtres formels.
Les paramtres formels doivent avoir le mme type que les paramtres effectifs (ou un type compatible), mais pas ncessairement
le mme nom.
Voyons ce qui se passe quand on modifie la valeur d'un paramtre formel. Voici une mthode ChangeInt qui prend un entier en
paramtre, le modifie, et affiche son contenu :
Code : C#
Code : C#
www.openclassrooms.com
Partie 1 : Les fondamentaux 52/132
Code : Console
myInt n'a pas t chang car on n'a fait que modifier myParameter, qui ne contenait qu'une copie de sa valeur. Le
comportement observ est le mme que dans l'exemple donn prcdemment.
Il peut cependant tre utile de modifier un paramtre effectif depuis une mthode, c'est--dire de rpercuter les changements sur
le paramtre qui a t transmis. Pour cela, on utilise le passage par rfrence.
ref
Reprenons l'exemple en modifiant la mthode ChangeInt :
Code : C#
Code : C#
Code : Console
www.openclassrooms.com
Partie 1 : Les fondamentaux 53/132
L'utilisation de ref impose que le paramtre effectif soit une variable correctement initialise. Vous ne pourrez donc pas compiler
les exemples de code suivant :
Code : C#
int myInt = 5;
// Erreur du compilateur : "Argument 1 must be passed with the
'ref' keyword".
ChangeInt(myInt);
Code : C#
Code : C#
Il peut arriver qu'un paramtre serve uniquement rcuprer une valeur initialise par la mthode. C'est notamment utile
lorsqu'une mthode doit renvoyer plusieurs valeurs. Pour ces cas-l, on utilise le mot-clef out.
out
L'utilisation de out impose la mthode d'assigner une valeur au paramtre avant de se terminer. Et contrairement ref, il n'est
pas obligatoire d'assigner une valeur au paramtre avant de le transmettre la mthode : la valeur transmise ne sera de toute
faon pas utilisable dans la mthode.
Code : C#
www.openclassrooms.com
Partie 1 : Les fondamentaux 54/132
Code : C#
Code : Console
En pratique, out est utilis beaucoup plus souvent que ref, car il arrive frquemment qu'une mthode doive retourner plus
d'une valeur. Par exemple, la mthode int.TryParse sert convertir une chane de caractres en entier. Elle renvoie deux
valeurs : un entier (le rsultat de la conversion), et un boolen (qui indique si la conversion a russi ou non). Elle s'utilise comme
ceci :
Code : C#
int myInt;
bool success = int.TryParse("1234", out myInt);
if(success)
{
Console.WriteLine("La conversion a russi, le double du nombre est
: " + myInt * 2 + ".");
}
else
{
Console.WriteLine("La conversion a chou.");
}
La surcharge
La surcharge permet de crer des mthodes qui font globalement la mme chose en leur donnant le mme nom.
Elles doivent cependant avoir des signatures diffrentes. La signature d'une mthode permet de l'identifier ; elle dpend de deux
choses : son nom et ses arguments (mais pas son type de retour !). Pour la surcharge, les mthodes doivent donc tre
diffrentiables par au moins une des propositions suivantes :
le nombre de paramtres ;
le type de chaque paramtre.
Dans l'exemple suivant, on cre deux mthodes SayHello dont l'une, une fois appele, affichera juste "Hello!" (on ne lui
passe aucun paramtre), et l'autre affichera par exemple "Hello John!" si on lui passe en paramtre la chane de caractres
"John" :
Code : C#
void SayHello()
{
Console.WriteLine("Hello!");
}
www.openclassrooms.com
Partie 1 : Les fondamentaux 55/132
Je sais que je n'arrte pas de vous le dire, mais l encore, c'est une notion fondamentale ! Elle existe d'ailleurs dans de nombreux
langages (dans lesquels on utilise plus le mot "fonction" que "mthode").
www.openclassrooms.com
Partie 1 : Les fondamentaux 56/132
Let's go ! (Allons-y )
Crer une classe
Prsentation
Une classe est tout simplement un moule pour faire des objets.
Un objet est compos de membres ; parmi ces membres, on dispose de champs (les variables qui lui sont caractristiques), de
mthodes, de proprits, ainsi que d'autres lments que nous verrons plus tard. On a tendance croire que "champ" et
"membre" dsignent la mme chose alors que c'est faux : il faut bien voir qu'il existe plusieurs sortes de membres, dont les
champs.
Prenez la bonne habitude de faire commencer le nom des champs par "m_", comme dans "m_age" (le 'm' n'tant pas
sans lien avec "membre" ; en revanche cela ne concerne pas tous les membres mais juste les champs). C'est trs
important : cela permet de savoir quels champs vous avez crs.
C'est dans la classe que sont dfinis les membres (dont les champs et les mthodes). Tout objet cr partir d'une classe
possde les membres que propose cette classe, vous comprenez donc pourquoi je parle de "moule objet".
Code : Autre
class nomDeLaClasse
{
// Dclaration des champs
Les champs sont de simples variables, vous savez donc les dclarer.
Le constructeur
C'est le nom que l'on donne une mthode spciale dans une classe. Le constructeur (c'est aussi un membre) d'une classe est
appel chaque fois que vous voulez crer un objet partir de cette classe. Vous pouvez donc crire du code dans cette
mthode et il sera excut chaque cration d'un nouvel objet.
Pour filer la mtaphore du moule, les objets seraient les gteaux que l'on peut faire avec et le constructeur serait en quelque sort
notre cuisinier.
Le constructeur est la mthode qui a exactement le mme nom que la classe, et qui ne retourne jamais rien. Il est donc
inutile de prciser s'il retourne quelque chose ou non : on ne met mme pas de void devant. Par contre, vous pouvez
lui passer des arguments.
Lorsqu'il est appel, le constructeur rserve un emplacement mmoire pour votre objet et si vous n'avez pas initialis ses champs,
il les initialise automatiquement leur valeur par dfaut.
Sachez aussi que vous n'tes pas obligs d'crire vous-mmes le code du constructeur ; dans ce cas, un constructeur "par
dfaut" est utilis. Si vous faites ainsi, lorsque l'objet est cr, tous ses champs qui ne sont pas dj initialiss dans le code de la
classe sont initialiss leur valeur par dfaut.
L'intrt du constructeur est d'offrir au dveloppeur la possibilit de personnaliser ce qui doit se passer au moment de la cration
d'un objet. Il rajoute en outre un aspect dynamique au code : vous pouvez affecter vos champs l'aide de variables passes en
paramtres.
www.openclassrooms.com
Partie 1 : Les fondamentaux 57/132
Le destructeur
Le destructeur (c'est aussi un membre) est une mthode appele lors de la destruction d'un objet. Son nom est celui de la classe,
prcd d'un tilde '~'.
L-aussi, rien ne vous oblige mettre un destructeur. C'est seulement si vous voulez faire quelque chose de particulier sa
destruction. Cela peut notamment servir librer de la mmoire et bien grer les ressources ; c'est bien trop compliqu pour
l'instant alors nous en parlerons en temps et en heure.
Exemple
Nous allons tudier une classe Person (qui reprsente une personne, vous l'aurez devin ). Dans cet exemple, vous ne
comprendrez pas le code la premire lecture ; pas d'affolement, les explications arrivent juste aprs.
Code : C#
public Person()
{
Console.WriteLine("Nouvelle personne cre.");
}
~Person()
{
Console.WriteLine("Objet dtruit.");
}
Les modificateurs private et public se mettent devant un type (par exemple : une classe) ou un membre (par exemple : un
champ ou une mthode).
private restreint l'accs de ce qui suit l'usage exclusif dans le bloc o il a t dclar.
public autorise quant lui l'accs de ce qui suit depuis l'extrieur.
www.openclassrooms.com
Partie 1 : Les fondamentaux 58/132
Le constructeur doit imprativement tre prcd de public si vous voulez pouvoir l'appeler et crer un objet.
Par dfaut, champs et mthodes utilisent le modificateur private, mais pour bien voir ce que l'on fait, il est prfrable de
toujours prciser. Nous verrons plus tard qu'il existe d'autres possibilits que public pour les classes elles-mmes, mais ne
nous y attardons pas pour l'instant.
Prenez comme habitude de dfinir vos champs en priv, pour viter qu'il puissent tre modifis de n'importe o et viter
des erreurs.
Vous pouvez cependant accder publiquement des champs privs, en ayant recours des proprits, comme dans cette classe
avec la proprit Age :
Code : C#
l'intrieur du bloc get, vous dfinissez comment se fait l'accs en lecture. Dans ce cas, si l'on veut rcuprer la valeur de l'ge,
on pourra crire ushort userAge = toto.Age; (toto tant un objet de type Person).
l'intrieur du bloc set, vous dfinissez comment se fait l'accs en criture. Dans ce cas, si l'on veut changer la valeur de l'ge,
on pourra crire toto.Age = 10; (10 tant ici implicitement converti en ushort).
La variable value reprsente la valeur que l'on veut donner m_age. Si l'on crit toto.Age = 10;, value est un ushort
qui vaut 10.
Les proprits ont un statut particulier ; en fait ce ne sont pas des variables mais des moyens d'accder des variables.
D'ailleurs, get et set sont ce qu'on appelle des accesseurs. Utiliser une proprit en dfinissant ses accesseurs revient
exactement crer une mthode d'accs en lecture (que l'on peut ici nommer GetAge) et une mthode d'accs en criture (que
l'on peut ici nommer SetAge) :
Code : C#
J'ai sciemment employ le nom "value" pour que vous voyiez comment la variable value est traite dans le code d'une
proprit. Autant j'aurais pu nommer ce paramtre diffremment, autant dans un bloc set on est oblig d'utiliser le nom "value"
(si on n'avait pas de nom standardis, le compilateur ne pourrais pas s'en sortir !).
Revenons l'exemple de classe que je vous ai fourni. J'ai cr deux mthodes portant le mme nom Person. Ce n'est pas une
erreur, en fait j'ai surcharg le constructeur.
this est un mot-clef du langage C# qui dsigne l'objet lui-mme ("this" veut dire "ceci" en anglais). L'criture this.m_age
www.openclassrooms.com
Partie 1 : Les fondamentaux 59/132
this est facultatif, donc par la suite j'crirai m_age au lieu de this.m_age.
Crer un objet
Rappelez-vous, en introduisant les variables nous avons voqu l'existence de variables de type valeur et de variables de type
rfrence. Jusqu' prsent, nous n'avions rencontr que des types valeurs (int, string, etc.). Comme les classes sont des
types rfrences, il est temps de s'y intresser plus en dtail.
Une variable de type rfrence (ou tout simplement, une rfrence) est une variable dont la valeur est l'adresse d'un emplacement
mmoire.
Cet emplacement contient des informations utiles notre programme, comme par exemple une instance de classe. Les habitus
du C/C++ retrouveront beaucoup de similitudes avec le concept de pointeur.
Un objet est toujours issu d'une classe. On dit que c'est une instance de cette classe. La particularit des instances de classe est
qu'elles se baladent toujours quelque part dans la mmoire, plus librement que les autres variables. Nous avons donc besoin
d'une rfrence pour savoir o elles se trouvent et ainsi pouvoir les manipuler. Contrairement aux variables de type valeur qui
contiennent une valeur que l'on manipule directement, les rfrences ne font que dsigner une instance qui, elle, peut contenir
une ou plusieurs valeurs. L'accs ces valeurs se fait donc indirectement.
Pas de panique, c'est plus simple que a en a l'air Voyons ce que a donne en pratique avec la classe Person que nous
avons dfinie plus haut.
Pour manipuler une instance de cette classe, je vais devoir faire deux choses :
Une rfrence est avant tout une variable, et se dclare comme toutes les variables. Son type est le nom de la classe que l'on
compte instancier :
Code : C#
Person toto;
On vient de dclarer une rfrence, appele toto, qui est prte dsigner un objet de type Person.
Nous n'avons fait que dclarer une rfrence sans prciser de valeur ; elle a dans ce cas t initialise sa valeur par dfaut, qui
est null pour les rfrences. Ce code est donc quivalent :
Code : C#
www.openclassrooms.com
Partie 1 : Les fondamentaux 60/132
Lorsqu'une rfrence vaut null, cela signifie qu'elle ne dsigne aucune instance. Elle est donc inutilisable. Si vous tentez de
vous en servir, vous obtiendrez une erreur la compilation :
Code : C#
Person toto;
// Erreur la compilation: "Use of unassigned local variable
'toto'".
toto.SayHi();
Le compilateur vous indique que vous essayez d'utiliser une variable qui n'a pas t assigne. Rappelez-vous, nous avons vu a
dans le chapitre "Les variables", paragraphe "Utiliser des variables".
En revanche, vous pouvez tout fait dclarer un champ sans l'instancier : le constructeur de la classe se charge tout seul
d'instancier leur valeur par dfaut tous les champs qui ne sont pas dj instancis. C'est pourquoi dans la classe Person ci-
dessus, j'ai pu crire private string m_name; sans crire private string m_name = string.Empty; ou
encore private string m_name = "";.
Peut-on initialiser une rfrence avec une adresse mmoire explicite (comme en C/C++) ?
Non, de base c'est impossible en C# ; pour le faire, il faut utiliser le mot-clef unsafe, mais c'est une notion avance et nous
aurons peut-tre l'occasion de la rencontrer plus tard. De base, il n'est d'ailleurs pas non plus possible de lire l'adresse contenue
dans une rfrence.
Voyons alors comment assigner une valeur notre rfrence.
Code : C#
// Dclaration de la rfrence.
Person toto;
// Instanciation de la classe.
toto = new Person();
Comme pour toute initialisation de variable, on peut fusionner ces deux lignes :
Code : C#
// Dclaration + instanciation
Person toto = new Person();
ce stade nous avons cr une nouvelle instance de la classe Person, que nous pouvons manipuler grce la rfrence
toto.
Lorsque l'oprateur new est utilis, le constructeur de la classe est appel. Nous avons vu qu'il pouvait y avoir plusieurs
surcharges du constructeur dans une mme classe, comme c'est le cas dans la classe Person. La version du constructeur
www.openclassrooms.com
Partie 1 : Les fondamentaux 61/132
appele grce new est dtermine par les paramtres spcifis entre les parenthses.
Jusqu' prsent nous nous sommes contents d'crire new Person(), et nous avons ainsi utilis implicitement le
constructeur sans paramtre (on l'appelle constructeur par dfaut).
La classe Person possde un autre constructeur qui nous permet de prciser le nom et l'ge de la personne. Profitons-en pour
prciser que toto s'appelle Toto et a 10 ans, au moment de crer notre instance :
Code : C#
Code : C#
Si vous ne comprenez pas tout de suite la syntaxe des deux dernires lignes du bout de code prcdent, c'est normal : nous
n'avons pas encore vu comment utiliser des objets (a ne saurait tarder).
Maintenant que nous savons crer des objets, voyons plus en dtail comment nous en servir.
Utiliser un objet
Accder aux membres d'un objet
Un fois l'objet cr, pour accder ses membres il suffit de faire suivre le nom de l'objet par un point.
toto.m_age n'est pas accessible car m_age est dfini avec private. On peut en revanche accder la proprit publique
toto.Age et la mthode publique toto.SayHi.
Code : C#
Code : Console
Les proprits
Pourquoi utiliser des proprits alors que l'on peut utiliser public la place de private ?
Cela permet de rendre le code plus clair et d'viter les erreurs. On laisse en gnral les champs en private pour tre sr qu'ils
ne seront pas modifis n'importe comment.
Ensuite, on peut nanmoins vouloir accder ces champs. Si tel est le cas, on utilise les proprits pour contrler l'accs aux
champs. Dans certains langages, on parle d'accesseurs. En C#, les accesseurs sont get et set. Ils sont utiliss au sein d'une
proprit.
www.openclassrooms.com
Partie 1 : Les fondamentaux 62/132
Code : C#
Comme je vous l'ai dit plus haut, get gre l'accs en lecture alors que set gre l'accs en criture. Si vous ne voulez pas
autoriser l'accs en criture, il suffit de supprimer le set :
Code : C#
Code : C#
Dans ce cas, vous n'avez plus besoin de m_age. Le compilateur comprend que vous autorisez l'accs en lecture et en criture.
Si vous utilisez les accesseurs auto-implments, vous devez grer les deux accesseurs.
Code : C#
// Erreur du compilateur :
// 'ConsoleApplication1.Person.Age.get' must declare a body because
it is not marked abstract or extern.
// Automatically implemented properties must define both get and
set accessors.
public ushort Age { get; }
Comment faire si je ne veux pas autoriser l'accs en criture dans le code simplifi ?
Il suffit de rajouter private devant set pour indiquer que Age n'aura le droit d'tre modifi qu' l'intrieur de la classe :
Code : C#
www.openclassrooms.com
Partie 1 : Les fondamentaux 63/132
Dans l'criture simplifie, il n'est plus question de m_age. Considrons le code suivant :
Code : C#
Si je modifie Age, cela ne va pas affecter m_age ! En effet, dans l'criture simplifie on ne fait pas de lien entre m_age et Age :
ils vivent leur vie chacun de leur ct.
Vous pouvez utiliser les deux critures dans votre code : soit l'criture complte, soit l'criture simplifie. Pour l'instant je
vais rester sur la premire que vous compreniez bien ce qui se passe. Et ne mlangez pas les deux !
Par contre, il faut respecter la convention voulant qu'avec l'criture simplifie, on crirait this.Age dans la classe
Person au lieu de m_age. Le this est facultatif dans les deux cas mais on l'utilise quand mme dans l'criture
simplifie car il permet de voir que Age dpend de l'instance avec laquelle on travaille.
La comparaison d'objets
Vous pouvez comparer des objets de diverses manires suivant ce que vous voulez vrifier.
Oui et non ; en fait cela dpend de ce que vous voulez savoir. Considrons l'exemple suivant :
Code : C#
Dans cet exemple, p1 n'est pas gal p2, mais p1 est gal p3 :
Code : C#
Rsultat :
Code : Console
En effet, les rfrences p1 et p2 dsignent chacune une instance diffrente de la classe Person. Ces deux instances sont
identiques du point de vue de leurs valeurs, mais elles sont bien distinctes. Ainsi, si je modifie la deuxime instance, cela ne va
pas affecter la premire :
Code : C#
www.openclassrooms.com
Partie 1 : Les fondamentaux 64/132
Console.WriteLine(p1.Age);
Console.WriteLine(p2.Age);
p2.Age = 5;
Console.WriteLine(p1.Age);
Console.WriteLine(p2.Age);
Ce code affichera :
Code : Console
10
10
10
5
Par contre, les rfrences p1 et p3 sont identiques et dsignent donc la mme instance. Si je modifie p3, cela affecte donc p1 :
Code : C#
Console.WriteLine(p1.Age);
Console.WriteLine(p3.Age);
p3.Age = 42;
Console.WriteLine(p1.Age);
Console.WriteLine(p3.Age);
Ce code affichera :
Code : Console
10
10
42
42
Pour reprendre ce qui vient d'tre dit, plutt que d'utiliser l'oprateur ==, vous pouvez utiliser la mthode Equals (que possde
tout objet). La seule diffrence est que == ne compare que des objets de mme type, alors que Equals permet de comparer un
objet d'un certain type avec un autre objet d'un autre type.
Quel est l'intrt de Equals, sachant que de toute faon si deux variables ne sont pas du mme type, elles ne peuvent
pas tre gales ?
Cela sert si, l'criture du code, vous ne connaissez pas le type des variables concernes.
ToString
Tout objet possde aussi cette mthode. Par dfaut, elle renvoie le type de l'objet en question :
Code : C#
Console.WriteLine(p1.ToString());
www.openclassrooms.com
Partie 1 : Les fondamentaux 65/132
Rsultat :
Code : Console
ConsoleApplication1.Person
En fait, pour cette ligne de code, il est inutile d'utiliser ToString car de toute faon la mthode WriteLine fait
appel la mthode ToString lorsqu'elle reoit un objet. J'aurais donc pu crire Console.WriteLine(p1);.
La mthode ToString peut tre modifie pour retourner un autre rsultat. Par exemple ici on pourrait vouloir renvoyer le nom
de la personne en question. Cela se fait avec le modificateur override, que nous tudierons plus tard.
Vous devez commencer mieux comprendre ce que veut dire Programmation Oriente Objet.
Tant mieux, c'est le but !
www.openclassrooms.com
Partie 1 : Les fondamentaux 66/132
Par habitude, mettez "s_" devant une variable statique. Cela permet d'accrotre la lisibilit de votre code.
Voici un exemple :
Code : C#
public Person()
{
s_count++;
}
}
J'espre que vous reconnaissez une classe assez simple, avec un lger changement : la prsence d'un champ statique s_count
que l'on incrmente chaque appel du constructeur. En fait j'ai fait un compteur qui indique le nombre d'objets crs. Ce
compteur ne dpend pas d'une instance en particulier, mais de la classe entire.
Comment y accder ?
Pour accder des champs statiques, il faut crire : nomDeLaClasse.nomDuChamp. Ici, il faut crire Person.Count pour
accder s_count qui est mis en private.
tant donn que ce champ ne dpend pas d'une instance en particulier, si je cre une instance de la classe Person
nomme toto, toto.Count n'existera pas.
Code : C#
www.openclassrooms.com
Partie 1 : Les fondamentaux 67/132
public Person()
{
s_count++;
}
Code : C#
Au cas o tous ces Console.WriteLine ne vous auraient pas fait tilt, eh oui, il s'agit bien de l'appel la mthode statique
WriteLine de la classe Console.
Vous pouvez crer une classe entirement statique, dont le but n'est alors pas de servir de moule instances. C'est d'ailleurs le
cas de la classe Console : on ne veut pas crer d'objet de type Console, mais faire des choses avec celle qui est ouverte.
C'est aussi le cas de la classe Convert qui sert faire des conversions et que nous verrons sous peu. Pour faire cela il faut
mettre static devant le nom de la classe, et du coup devant chacun de ses membres :
Code : C#
Rien de bien mchant dans celle-l non plus. Je pense que vous avez saisi l'ide.
Application console : tude du code
www.openclassrooms.com
Partie 1 : Les fondamentaux 68/132
Je vous ai dit comment utiliser la console, sans vraiment fournir d'explications. Nous allons donc prsent tudier le code qui se
trouve dans une application console frachement cre.
Un espace de noms contient des classes (avec des membres : champs, mthodes, etc.) ainsi que d'autres espaces de noms.
Ici, nous avons une classe Program au sein de l'espace de noms ConsoleApplication1 (le nom de mon projet, et aussi
de ma solution en l'occurrence).
Un espace de noms se comporte peu prs comme un dossier : il peut contenir des fichiers (ici les classes) et d'autres dossiers
(les espaces de noms inclus dedans). Pour accder au contenu d'un espace de noms, il faut mettre un point aprs son nom : pour
accder la classe Program, il faut ici crire ConsoleApplication1.Program.
Le mot-clef using
Les espaces de noms peuvent "s'emboter" l'infinie, ce qui fait que l'criture peut tre longue :
namespace1.namespace2.namespace3.namespace4 ...
On utilise donc le mot-clef using.
Les premires lignes dbutent par le mot-clef using, sous la forme d'une directive. En crivant using System; vous
informez Visual Studio que s'il ne trouve pas l'espace de noms ou la classe xxx, il devra regarder s'il/elle n'est pas dans
System.xxx.
using peut aussi servir crer un alias qui rfrence un espace de noms. Par exemple si nous crivons using Utils =
Company.Application.Utilities;, alors nous pourrons crire Utils.xxx plutt que d'crire
Company.Application.Utilities.xxx.
D'autre part, using peut tre utilis sous forme de dclaration. Cela permet d'appeler automatiquement la mthode Dispose()
de l'objet spcifi. L'objet doit implmenter l'interface IDisposable. Je ne veux pas plus vous embrouiller car nous n'avons
pas encore vu les interfaces, donc regardez juste cet exemple :
Code : C#
La classe Program
Cette classe a t automatiquement cre par Visual Studio. Elle contient une seule mthode, nomme "Main", qui prend en
entre un tableau de chanes de caractres et ne retourne rien (void).
static indique que la mthode est... statique !
Un programme console s'appelle depuis la console en passant des paramtres. Ces derniers sont envoys au programme dans le
tableau args.
Le programme commence s'excuter dans la mthode Main : c'est le point d'entre du programme. C'est donc l que nous
allons crire notre code.
Nous n'en avons pas fini avec les classes, mais vous avez le principal : a suffit pour le moment.
www.openclassrooms.com
Partie 1 : Les fondamentaux 69/132
Les tableaux
Maintenant que vous savez ce qu'est un objet et que vous tes initis la notion de rfrence, je peux vous parler des tableaux.
Tableaux simples
Un tableau ("array" en anglais) est un objet permettant de rassembler sous un mme identificateur des donnes de mme type.
Sa dclaration est la suivante : type[] nom = new type[n]; o n est le nombre de donnes que peut contenir le
tableau.
En fait, un tableau est mme un objet, c'est--dire qu'on y accde via une rfrence. De ce fait, un tableau dclar sans tre
initialis vaut null.
Code : C#
On a dclar notre tableau, et on l'a initialis sans prciser de valeur, donc avec la valeur par dfaut d'un entier,
savoir 0.
Vous pouvez trs bien prciser les valeurs que vous voulez mettre dans votre tableau. Voici comment crer un tableau contenant
les entiers 10, 20, 30 et 40 :
Code : C#
Vous remarquerez que vous ne devez plus donner de taille votre tableau : vous l'avez rempli avec quatre entiers donc
sa taille est 4.
Code : C#
nom[i] dsigne la donne n o i, o i appartient l'intervalle [0; n-1]. Si i n'appartient pas cet intervalle, ce code gnrera une
erreur. Ainsi, dans cet exemple :
myArray[0] vaut 10 ;
myArray[1] vaut 20 ;
myArray[2] vaut 30 ;
myArray[3] vaut 40 ;
myArray[4] est inaccessible. Eh oui, l nous sommes en dehors du tableau.
Dans le 1er exemple, nous n'avons que cr le tableau, sans affecter de valeur particulire ses lments
(myArray[0], myArray[1], ...) qui valent donc tous 0 (valeur par dfaut d'un entier).
Tableaux deux dimensions
Un tableau deux dimensions se dclare de la manire suivante : type[,] nom = new type[n, m]; o n est le nombre
de lignes et m le nombre de colonnes.
Voici comment dclarer un tableau deux dimensions contenant des rels :
www.openclassrooms.com
Partie 1 : Les fondamentaux 70/132
Code : C#
Le point et la virgule sont inverss en franais et en anglais. N'crivez donc pas 0,1 mais 0.1 (de mme pour les
autres nombres).
Code : C#
double[,] myArray =
{
{0.1, 0.5},
{1.3, 1.7}
};
Par soucis de clart, j'ai crit le code sur plusieurs lignes. Je vous conseille fortement de faire de mme, cela permet de
se relire plus facilement.
nom[i, j] dsigne l'lment j de la ligne i du tableau nom. Ainsi, dans cet exemple :
Ne confondez pas avec myArray[i][j] ! Cela voudrait dire que myArray est un tableau simple et qu'il contient
des tableaux simples. Ainsi myArray[i][j] reprsente la j-ime case du i-ime tableau stock dans myArray.
Tableaux de tableaux
Un tableau de tableaux se dclare de la manire suivante : type[][] nom = new type[n][]; o n est le nombre de
lignes.
Ici on ne spcifie pas de nombre de colonnes car chaque tableau contenu dans ce "mga-tableau" possde un nombre
de colonnes qui lui est propre.
Code : C#
ligne n o 1 : On cre un tableau, nomm myIntArray, qui va pouvoir contenir 2 tableaux d'entiers. ce stade,
myIntArray[0] et myIntArray[1] valent null : ils ne rfrencent pas encore du contenu.
www.openclassrooms.com
Partie 1 : Les fondamentaux 71/132
ligne n o 2 : On cre le 1er tableau d'entiers avec 5 colonnes. myIntArray[0] ne vaut plus null mais contient la
rfrence vers son contenu. myIntArray[0][0] jusqu' myIntArray[4] valent 0 (valeur par dfaut d'un entier).
ligne n o 3 : On affecte la 2e case du 1er tableau avec la valeur 42.
Vous pouvez aussi crer un tableau partir de variables reprsentant des tableaux. Voici un exemple pour crer un tableau de
tableaux qui contiennent des chanes de caractres :
Code : C#
string[] firstnameArray =
{
"Matt",
"Tim",
"James"
};
string[] surnameArray =
{
"Johnson",
"Smith"
};
string[][] myArray =
{
firstnameArray,
surnameArray
};
Chaque lment myArray[i] est une rfrence de tableau une dimension. Si vous ne faites que dclarer le tableau, ces
rfrences ne sont pas initialises et elles valent null. C'est le cas dans le code suivant :
Code : C#
www.openclassrooms.com
Partie 1 : Les fondamentaux 72/132
Aprs excution, myArrayOfIntArrays[0] vaut null (de mme pour les autres lments).
Les tableaux sont utiles mais je ne pense pas que nous nous en servirons beaucoup dans ce cours. Dans la partie II, nous
verrons une alternative aux tableaux : les collections.
www.openclassrooms.com
Partie 1 : Les fondamentaux 73/132
Code : C#
Les conversions servent traiter des donnes de mme type, dans de nombreux cas comme une affectation, et quelque autre
opration.
Par exemple, au lieu de manipuler un chiffre, je peux vouloir manipuler le caractre qui lui correspond ; je peux prfrer utiliser des
entiers plutt que des nombres virgule ; ...
Conversions implicites
Conversions explicites (casts)
Conversions dfinies par l'utilisateur
Conversions avec les classes d'assistance
Conversions implicites
Avec des nombres, une conversion implicite peut tre effectue lorsque la valeur stocker peut tenir dans la variable sans tre
tronque ni arrondie. Par exemple, une variable de type long (entier cod sur 8 octets) peut stocker toute valeur qu'un entier
(cod sur 4 octets dans un ordinateur 32 bits) peut stocker.
Dans l'exemple suivant, le compilateur convertit implicitement la valeur droite en un type long avant de l'assigner bigNum :
Code : C#
De Vers
sbyte short, int, long, float, double ou decimal
byte short, ushort, int, uint, long, ulong, float, double ou decimal
www.openclassrooms.com
Partie 1 : Les fondamentaux 74/132
Pour les types rfrence, il existe toujours une conversion implicite entre une classe et l'une des ses classes de base. Aucune
syntaxe spciale n'est ncessaire parce qu'une classe drive contient toujours toutes les caractristiques de ses classes de
base. Exemple :
Code : C#
Remarque
J'imagine que je vais en surprendre certains si je vous dis que le code suivant est correct : string s = "M@teo" + 21;.
En fait, ce code est quivalant celui-ci : string s = string.Concat("M@teo", 21);. Et quand je dis quivalant, le
mot est faible ! Figurez-vous que le compilateur transforme automatiquement le premier code en le deuxime. l'excution, c'est
toujours Concat qui est appele.
La surcharge de Concat que nous utilisons prend des objets de type object et non string en paramtres, donc 21 est
converti en type object (le type de base de tout objet). Il ne s'agit donc pas d'une conversion implicite entre types numriques
mais entre type de base et type driv. Pour retourner une chane de caractres, Concat appelle la mthode ToString
implmente par tout objet. Par dfaut, cette dernire retourne une chane de caractres reprsentant le type de l'objet. Pour le
type int, ToString a t modifie (avec le modificateur override que nous verrons plus tard) et retourne l'entier considr
sous forme de chane de caractres.
Si 21 est pass en paramtre avec le type object, pourquoi est-ce que c'est la mthode int.ToString qui est
appele et non pas object.ToString ?
Trs bonne question. Nous verrons a plus tard, quand nous parlerons de polymorphisme.
Conversions explicites (casts)
Les casts
Si une conversion ne peut pas tre faite sans risque de perte d'informations, le compilateur requiert que vous effectuiez une
conversion explicite, appele cast. Un cast est une faon d'informer explicitement le compilateur que vous projetez de faire la
conversion et que vous tes informs qu'une perte de donnes peut se produire. Pour effectuer un cast, spcifiez le type voulu
entre parenthses devant la valeur ou la variable convertir.
Code : C#
Au cas o vous auriez oubli, le F signifie que le nombre est un float. float myFloat = 10.056; ne compilerait pas.
En effet, le compilateur comprend 10.056 comme un double, le F est l pour lui prciser que c'est un float (un f minuscule
convient tout aussi).
Aprs excution, myFloat vaut 10,605 et myInt vaut la partie entire de myFloat, soit 10.
De Vers
sbyte byte, ushort, uint, ulong ou char
byte sbyte ou char
www.openclassrooms.com
Partie 1 : Les fondamentaux 75/132
double sbyte, byte, short, ushort, int, uint, long, ulong, char, float, ou decimal
decimal sbyte, byte, short, ushort, int, uint, long, ulong, char, float ou double
Pour les types rfrence, les choses sont plus compliques et nous verrons cela plus tard.
Classes et mthodes de conversion
Les Classes Convert et TypeConverter
La classe statique Convert, de l'espace de noms System, implmente des mthodes qui permettent de convertir des variables
d'un type vers un autre type.
Les types de base pris en charge sont Boolean (bool), Char (char), SByte (sbyte), Byte (byte), Int16 (short),
Int32 (int), Int64 (long), UInt16 (ushort), UInt32 (uint), UInt64 (ulong), Single (float), Double
(double), Decimal (decimal), DateTime et String (string).
Il existe une mthode de conversion pour convertir chaque type de base en chaque autre type de base. l'excution, quatre
rsultats sont possibles :
Aucune conversion. Cela se produit lorsqu'une tentative est faite pour convertir un type en lui-mme. Dans ce cas, la
mthode retourne simplement une instance du type d'origine.
L'exception InvalidCastException est leve. Cela se produit pour les conversions suivantes :
Conversions Char <-> Boolean, Single, Double, Decimal ou DateTime ;
Conversions DateTime <-> tout autre type sauf String.
La conversion est russie. Toutes les conversions qui ne provoquent pas de perte de donnes russissent.
L'exception OverflowException est leve. Cela se produit lorsqu'une conversion restrictive provoque une perte de
donnes. Par exemple, la tentative de convertir une instance Int32 dont la valeur est 10 000 en un type Byte lve
OverflowException parce que 10 000 est en dehors de la plage de donnes du type Byte.
Aucune exception n'est leve si la conversion d'un type numrique entrane une perte de prcision (c'est--dire la perte de
quelques chiffres moins significatifs). Cependant, une exception est leve si le rsultat ne peut pas "tenir" dans le type voulu.
Par exemple, lorsqu'un Double est converti en un Single (float), cela peut entraner une perte de prcision, mais aucune
exception n'est leve. Cependant, si la valeur du Double est trop leve pour tre reprsente par un Single, une exception
de dpassement est leve.
Vous apprendrez davantage de choses sur la classe Convert par la suite, et je parlerai de la classe TypeConverter une fois
que vous saurez ce qu'est une interface.
Mthodes
D'autre part, il existe des mthodes qui ne sont pas dans des classes spciales mais qui sont directement accessibles pour des
types de base.
Par exemple, la structure Int32 (int) implmente une mthode Parse (surcharge) pour effectuer une conversion vers un
entier. Cependant, si la conversion ne russit pas, un exception est leve. Vous pouvez ensuite grer l'exception comme bon vous
semble mais nous verrons cela dans la partie II seulement.
Sinon il est intressant d'utiliser la mthode TryParse de cette mme structure (int) pour s'assurer qu'aucune exception ne
www.openclassrooms.com
Partie 1 : Les fondamentaux 76/132
sera leve. Cette mthode prend divers paramtres, dont un entier, prcd de out. Si vous ne vous rappelez plus quoi sert ce
out, je vous invite relire le paragraphe sur les passages par rfrence, dans la sous-partie "Appeler une mthode" du chapitre
"Les mthodes".
Place aux exemples (l'exemple n o 3 n'est l qu' titre illustratif puisque nous n'avons pas encore tudi les exceptions) :
Code : C#
int parsedInt;
if (int.TryParse("1234", out parsedInt))
{
Console.WriteLine("Conversion russie.");
}
else
{
Console.WriteLine("Conversion impossible.");
}
Code : C#
int parsedInt;
int.TryParse("1234", out parsedInt);
Code : C#
int parsedInt;
try
{
parsedInt = int.Parse("1234");
}
catch (Exception ex)
{
Console.WriteLine("Une erreur est survenue : " + ex.Message);
}
Ces trois exemples font globalement la mme chose : on obtient un entier partir d'une chane de caractres. Certaines
diffrences persistent toutefois.
La mthode TryParse retourne un boolen, c'est pourquoi elle est utilise avec un if dans l'exemple n o 1.
Vous pouvez aussi faire comme si elle ne retournait rien en l'utilisant en simple dclaration (voir exemple n o 2).
Dans l'exemple n o 3, on essaie directement de parser la chane de caractres ; si ce n'est pas possible, on signale l'erreur.
Je sais que nous n'avons pas encore vu les exceptions, et que par consquent l'exemple n o 3 ne doit pas vous parler. Ce n'est pas
bien grave : cet exemple n'est l qu' titre illustratif, et n'est pas crucial.
Le C# est un langage dans lequel la rigueur est de mise lorsqu'il s'agit de manipuler des variables de types diffrents. Certains
peuvent trouver cela trop contraignant, mais c'est un bon moyen de comprendre ce qui se passe rellement et cela permet
d'viter des erreurs.
www.openclassrooms.com
Partie 1 : Les fondamentaux 77/132
de la concatnation ;
des chanes de formatage ;
de la classe StringBuilder.
La concatnation
Concatner signifie mettre bout bout des chanes de caractres.
L'oprateur +
En C#, vous pouvez utiliser l'oprateur +. Ce n'est pas bien compliqu : il suffit de sparer des chanes de caractres avec un + :
Code : C#
Vous voyez que vous pouvez directement mettre des chanes de caractres "en dur" entre crochets, comme ici avec l'espace qui
spare les deux mots.
La mthode Concat
La mthode Concat de la classe String (aussi accessible via l'alias string) permet de mettre bout bout les paramtres qui
lui sont passs (en essayant de les convertir en chanes de caractres).
Cela revient sparer les chanes de caractres par un +, ainsi string s1 = string.Concat("Hello ",
"World!"); revient faire string s1 = "Hello " + "World!";.
Les chanes de formatage
Une chane de formatage est une chane de caractres avec des caractres spciaux, reconnus et remplacs par la reprsentation
d'objets sous forme de chanes de caractres.
C'est notamment ce que nous utilisons avec la mthode Console.WriteLine :
Lorsque vous appelez une fonction qui prend une chane de caractres en premier paramtre et ensuite un tableau d'objet
prcd de params, c'est qu'on attend une chane de formatage (d'ailleurs dans ce cas le nom du paramtre de type string est
"format").
En gnral, ces fonctions sont surcharges, ne vous affolez donc pas si vous ne voyez pas tout de suite les mmes paramtres,
et parcourez les diffrentes surcharges. Voici les quelques surcharges de la mthode Console.WriteLine :
www.openclassrooms.com
Partie 1 : Les fondamentaux 78/132
Dans une chane de formatage, {i} est remplac par la reprsentation sous forme de chane de caractres du paramtre n o (i+2)
(le paramtre n o 1 est une chane de formatage).
L'index i doit appartenir 0 inclus et (n-2) inclus : [0; n-2] ; sinon une exception est leve.
Si vous voulez crire {i} sans que cela soit reconnu comme des caractres spciaux, doublez les accolades : crivez {{i}}.
Code : Console
5 + 6 = 11
Cependant, vous pouvez aussi utiliser les chanes de formatage, mme quand on n'attend qu'une simple chane de caractres.
Pour ce faire, utilisez la mthode String.Format qui retourne la chane de caractres que vous voulez construire partir de
divers lments.
Code : C#
string s = String.Format(
"{{0}} est remplac par {0} et {{1}} par {1}",
"paramtre2",
"paramtre3");
Aprs excution, s vaut "{0} est remplac par paramtre2 et {1} par paramtre3".
Une dernire chose savoir avant de laisser les chanes de formatage : vous pouvez dterminer la faon dont une donne va tre
reprsente en faisant suivre l'index i de deux points et de caractres spciaux, comme ceci : {0:X}.
La console n'affiche pas bien tous les caractres spciaux, par exemple le ?. C'est pourquoi je n'utilise pas
Console.WriteLine.
Voici donc les diffrents caractres spciaux, ainsi que des exemples :
www.openclassrooms.com
Partie 1 : Les fondamentaux 79/132
C ou c Devise
string.Format("{0:C}", -2.5); ($2.50) -2.50
D ou d Dcimal string.Format("{0:D5}", 25); 00025 00025
E ou e Scientifique string.Format("{0:E}", 250000); 2.500000E+005 2,500000E+005
Il s'agit d'identifiants pour dsigner des cultures ; en-US dsigne "English - United States" et fr-FR dsigne "franais - France".
Dans un programme cela sert grer diffremment l'affichage suivant l'endroit o vous vivez. La culture dpend de la langue, des
habitudes de reprsentation des nombres, ...
Aucune ligne de code du tableau ne fait mention la culture ; en fait si vous ne spcifiez rien, votre systme d'exploitation s'en
charge. Si vous vivez en France, votre culture est par dfaut fr-FR, donc vous aurez les rsultats de la colonne fr-FR et non en-
US.
On peut aussi passer un paramtre de type IFormatProvider. En fait IFormatProvider est une interface, vous devez
donc passer un objet dont le type implmente cette interface, comme ici le type CultureInfo.
Je ne veux pas que nous nous attardions trop longtemps sur ce point qui sera tudi par la suite, et est srement difficile quand
on dbute. Je vous donne donc un exemple si a vous vous intresse, mais je ne dtaille pas fond :
Code : C#
string s1 = String.Format(
new System.Globalization.CultureInfo("fr-FR"),
"{0:C}",
2.5);
La mthode ToString prend aussi une chane de formatage en paramtre, et l par contre il n'a plus de {i} mais simplement
les caractres spciaux (en effet, en sait dj ce qu'on doit afficher : c'est l'objet avec lequel on appelle ToString) :
Code : C#
string s2 = 5.ToString(
"c",
new System.Globalization.CultureInfo("fr-FR"));
Les deux mthodes retenir sont Append qui ajoute une chane de caractres la suite des autres, et ToString qui sert
obtenir la chane de caractres complte. Exemple :
Code : C#
www.openclassrooms.com
Partie 1 : Les fondamentaux 80/132
Code : C#
Je vous ai donn ce code pour vous montrer la philosophie des objets de type StringBuiler. Le code n'est pas faux, mais le
deuxime est plus lisible pour le mme rsultat.
L'utilisation de StringBuilder permet d'optimiser la mmoire, mais seulement si vous faites des concatnations dans des
boucles. Dans le cas qui suit, il s'avre trs utile :
Code : C#
Ici j'utilise AppendLine ; c'est comme Append mais a rajoute un retour la ligne aprs.
Aprs tout, "la programmation est l'art de passer des semaines gagner quelques millisecondes"...
Le plus important dans ce chapitre est certainement la notion de chanes de formatage. Cela nous servira notamment lorsque
nous travaillerons avec le temps, mais c'est loin d'tre la seule utilisation.
www.openclassrooms.com
Partie 1 : Les fondamentaux 81/132
J'y arrive. Dans la console, aprs avoir crit le nom de votre solution suivi de ".exe", laissez un espace et crivez du texte. Chaque
mot est considr comme un argument ; les espaces font office de sparateur d'arguments. Si toutefois vous souhaitez passer un
argument qui contient des espaces, mettez cet argument entre guillemets : "un seul argument avec des espaces"
(guillemets inclus) ne constitue qu'un seul argument (dont la valeur est prive des guillemets).
En gnral un tableau contient une proprit Length qui est un entier valant la taille de ce tableau. Modifiez le code comme ceci
dans Visual Studio :
Code : C#
N'oubliez pas de compiler votre programme ! Pour ce faire, appuyez sur F6 pour simplement le mettre jour, ou sur F5 pour lancer
en plus le mode debug. crivez ceci dans la console (aprs le nom du programme) : argument1 argument2 .
www.openclassrooms.com
Partie 1 : Les fondamentaux 82/132
Afficher du texte en console, c'est bien mais on peut faire encore plus : lire des donnes en console.
C'est ce que je vais vous apprendre faire tout de suite.
Il suffit juste de faire string input = Console.ReadLine(); : aprs excution de cette instruction, la console attend
que vous entriez du texte et ds que vous appuyez sur Entre, la ligne crite en console est stocke dans une chane de
caractres nomme input. Essayez :
Code : C#
Le caractre " est compris comme un dlimiteur de chane de caractres. Pour qu'il soit considr comme un caractre
normal, il faut mettre un backslash (barre oblique inverse) devant. Ainsi \" sera affich " .
Vous pouvez aussi ne rcuprer qu'un caractre avec Console.Read();. Cette mthode renvoie un entier reprsentant le
premier caractre entr, il va donc falloir le caster : char myChar = (char)Console.Read();.
Ainsi si je tape abc puis que j'appuie sur Entre, myChar vaudra 'a'.
Ce cast peut potentiellement poser problme puisque un entier est cod sur 4 octets et un caractre seulement sur 2.
Toutefois, ici l'entier retourn est suffisamment petit pour tenir sur 2 octets. C'est comme si je vous disais d'crire un
nombre de 5 chiffres sur seulement 3 chiffres : c'est faisable avec 00123 mais pas avec 12345.
valuations paresseuses des oprateurs && et ||
Maintenant que nous avons vu les mthodes, les classes et la console, je me dois de vous faire une remarque sur les oprateurs,
en particulier && et ||.
On dit que les valuations des oprateurs && et || sont paresseuses car elles se font de gauche droite et elles s'arrtent ds
que le rsultat de l'expression entire est connu, ce qui peut arriver sans que l'on ait besoin de tout valuer.
Par exemple, tant donn que false && xxx ne peut valoir que false, l'expression xxx ne sera pas value. xxx
reprsente ici du code qui est valu comme un boolen, cela peut donc tre un appel une mthode qui retourne un boolen.
Ici, la consquence est que cette mthode n'est pas appele, car on n'a pas besoin de son rsultat pour valuer l'expression
entire.
De mme, true || xxx ne peut valoir que true, donc l non plus l'expression xxx ne sera pas value.
Illustration :
Code : C#
class Program
{
public static bool Test1()
{
Console.WriteLine("Test1");
return false;
}
www.openclassrooms.com
Partie 1 : Les fondamentaux 83/132
Console.WriteLine("Test3");
return true;
}
if (Test3() || Test4())
{
Console.WriteLine("Oprateur utilis : ||");
}
}
}
Code : Console
Test1
Test3
Oprateur utilis : ||
Vous voyez que seules les mthodes Test1 et Test3 ont t appeles. Ils existe une version "non paresseuse" de && et ||, il
s'agit de & et |. Modifiez votre mthode Main comme ceci :
Code : C#
if (Test3() | Test4())
{
Console.WriteLine("Oprateur utilis : |");
}
}
Code : Console
Test1
Test2
Test3
Test4
Oprateur utilis : |
www.openclassrooms.com
Partie 1 : Les fondamentaux 84/132
www.openclassrooms.com
Partie 1 : Les fondamentaux 85/132
TP : Plus ou moins
C'est l'heure du TP ! Un TP est un bon moyen de voir comment vous vous en sortez tous seuls, et c'est aussi l'occasion pour
vous de pratiquer.
Vous allez crer un mini-jeu sur console. Je vais vous dire ce en quoi consistera le jeu, vous donner des conseils, et enfin la
solution.
Mais attention, il ne faut pas que vous regardiez la rponse ds le dbut, c'est inutile !
Informations indispensables
System.Random rand = new System.Random(); permet de crer un objet partir de la classe Random, appartenant
l'espace de noms System.
rand tant l'objet cr ci-dessus, et maxValue tant un entier, rand.Next(maxValue) retourne un entier appartenant
[0; maxValue[ (maxValue est une borne exclue).
str tant une chane de caractres et integer tant un entier, int.TryParse(str, out integer) essaie de
convertir la chane de caractres en un entier et retourne un boolen qui vaut true si la conversion a march (donc false
sinon). Revoyez ce que veut dire out si vous avez oubli !
Allez, a suffit comme a ; je vous ai dj mch tout le travail. Au boulot maintenant, faites bosser vos mninges !
Correction
La suite est lire uniquement aprs avoir cherch par soi-mme !
Voici le code :
www.openclassrooms.com
Partie 1 : Les fondamentaux 86/132
100 (inclus).");
// Tant que le jeu n'est pas fini (game over, vous savez !)...
while (!over)
{
string inputString = Console.ReadLine();
int inputNumber;
// Si la conversion a march...
if (int.TryParse(inputString, out inputNumber))
{
// Si c'est en dehors des limites...
if (inputNumber < 0
|| inputNumber > 100)
{
Console.WriteLine("Veuillez entrer un nombre compris entre 1
et 100 (inclus).");
}
// Si c'est le bon...
else if (inputNumber == secretNumber)
{
Console.WriteLine("Vous avez gagn ! Le nombre mystre tait :
{0}.", secretNumber);
over = true;
}
while (!over) revient faire while (over != true) ou encore while (over == false).
chaque passage dans la boucle, je cre une string inputString et un int inputNumber. Ces deux variables tant
cres dans la boucle, la fin de chaque tour elles sont dtruites, et seront recres au tour suivant.
Cela fait que ces deux variables ne sont donc accessibles qu' l'intrieur de la boucle, pas aprs.
Vous pouvez continuer crer des mini-jeux sur console si vous voulez.
www.openclassrooms.com
Partie 1 : Les fondamentaux 87/132
Nous allons par contre laisser de ct la console partir de maintenant, pour nous tourner vers les applications en fentres (bien
plus jolies).
C'tait un peu long, mais c'tait un passage oblig. Avec tout ce que vous avez appris, vous allez maintenant pouvoir aller plus
loin et commencer faire des choses bien plus avances et intressantes.
www.openclassrooms.com
Partie 1 : Les fondamentaux 88/132
prsent vous connaissez les bases de la programmation en C#, mais il vous manque encore beaucoup de notions.
Dans cette partie, je vais vous prsenter des notions plus complexes (mais importantes !), de niveau intermdiaire. Cela vous
permettra de gagner en souplesse lors de la ralisation de vos programmes et de crer vos premires petites interfaces
graphiques (fentres).
Lorsque vous aurez acquis ces connaissances, nous pourrons nous concentrer 100% sur la cration d'interfaces graphiques !
C'est ce qui vous permet de faire des applications en fentres (appeles forms).
Cration de la solution
Ouvrez Visual Studio si ce n'est dj fait.
Cliquez sur "File" > "New Project".
Slectionnez "Windows Forms Application" :
Program.cs
www.openclassrooms.com
Partie 2 : Notions importantes 89/132
a ressemble au code du fichier Program.cs pour une application console, avec tout de mme des diffrences :
Pour le savoir, il suffit d'aller jeter un coup d'il dans Form1.cs. Pour visualiser la partie code, faites un clic-droit et slectionnez
"View Code" :
www.openclassrooms.com
Partie 2 : Notions importantes 90/132
Dans le code, vous voyez qu'il y a des nouveaux espaces de noms utiliss : c'est principalement pour l'affichage.
l'intrieur de notre espace de noms, vous voyez qu'une classe Form1 est dclare, et qu'elle drive de la classe Form.
partial signifie que la classe est dfinie plusieurs endroits. Ici vous ne voyez que ce que vous devez toucher.
L'autre partie de la classe a t faite automatiquement et se charge du reste.
l'intrieur du constructeur, la mthode InitializeComponent est appele. Elle est cre dans une autre partie de la
classe Form1 situe dans Form1.Designer.cs :
www.openclassrooms.com
Partie 2 : Notions importantes 91/132
Vous voyez un bloc nomm "Windows Forms Designer generated code". J'ai laiss ma souris au-dessus pour que vous voyiez
ce qu'il contient (on peut aussi l'ouvrir en cliquant sur le plus gauche).
Un tel bloc commence par #region nomDuBloc et finit par #endregion. Il est ignor lors de la compilation, il
sert y voir plus clair dans votre code : c'est trs utile quand vous parcourez des fichiers de plusieurs centaines de
lignes de code.
Pendant qu'on y est, au-dessus de ce bloc vous voyez des lignes bizarres :
Code : C#
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be
disposed; otherwise, false.</param>
Les lignes qui commencent par trois slashes (barres obliques) sont des lignes de commentaires spciaux. Ces commentaires sont
utiliss pour l'IntelliSense. Vous voyez que les commentaires sont faits avec des balises. Entre deux balises summary vous
dcrivez brivement quoi sert ce qui suit (ce peut tre une classe, une mthode, ...) en anglais. S'il s'agit d'une mthode qui
prend en entre des arguments, vous pouvez dtailler ce que chacun reprsente avec des balises param.
Regardez ce qu'affiche l'IntelliSense dans Form1.cs :
www.openclassrooms.com
Partie 2 : Notions importantes 92/132
Les contrles sont ces objets que vous pouvez dposer dans une fentre par un simple glisser-dposer ; par exemple un bouton,
une image, ...
Les contrles n'apparaissent dans la bote outils que si le fichier affich est en mode Design (ce qui n'est pas possible
pour tous les fichiers).
La partie Design vous montre l'allure de votre fentre. Pour la voir, double-cliquez sur Form1.cs dans l'explorateur de la solution,
ou faites un clic-droit dessus et vous pouvez faire "View Designer" pour voir la partie Design (de mme que "View Code" pour
voir le code).
Placez un bouton dans votre Form1 en faisant un glisser-dposer d'un objet Button dans la partie Design de votre Form1.
Vous pouvez l'tirer comme vous voulez.
www.openclassrooms.com
Partie 2 : Notions importantes 93/132
Proprits
Cliquez sur le bouton "Properties" dans l'explorateur de la solution pour afficher les proprits.
www.openclassrooms.com
Partie 2 : Notions importantes 94/132
Vous voyez en bas droite les proprits de l'objet slectionn (ici le bouton) :
Faites dbuter le nom de votre bouton par "m_" en changeant sa proprit Name (j'ai personnellement opt pour
m_myTestButton).
Essayez par vous-mmes de modifier des proprits pour voir ce que a donne, sachant qu'en bas de la fentre de proprits,
vous bnficiez d'une description de la proprit slectionne.
La classe MessageBox
La classe MessageBox sert afficher dans une fentre pop-up un message pouvant contenir du texte, des boutons et des
symboles donnant des informations et des instructions diverses l'utilisateur.
C'est une classe statique, vous ne pouvez donc pas crer d'instance de cette classe, mais seulement appeler les mthodes qu'elle
propose. La mthode qui nous intresse est Show. Plus vous lui passez d'arguments, plus votre MessageBox sera complte.
Elle est surcharge et possde 21 implmentations. Pour choisir laquelle utiliser, lisez ce que vous propose l'IntelliSense lorsque
vous crivez MessageBox.Show( dans le constructeur de la fentre Form1 (utilisez les flches haut/bas pour parcourir les
surcharges), ou crivez simplement MessageBox, faites un clic-droit dessus, et cliquez sur "Go To Definition". En clair, voici le
code que vous avez pour l'instant :
Code : C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
www.openclassrooms.com
Partie 2 : Notions importantes 95/132
Cette mthode retourne un DialogResult qui peut valoir (suivant quel bouton est cliqu dans le pop-up) :
DialogResult est une numration, donc pour accder ses valeurs, faites par exemple DialogResult.OK.
Code : C#
Code : C#
// Le mme avec
un titre.
MessageBox.Show(
"Du texte",
"Titre");
www.openclassrooms.com
Partie 2 : Notions importantes 96/132
Code : C#
Code : C#
Nous utilisons deux autres numrations ici : MessageBoxButtons qui reprsente diffrents groupes de boutons, et
MessageBoxIcon qui reprsente diffrentes icnes.
Vous conviendrez que les WinForms ont quand mme plus d'allure que la fentre toute noire qu'est la console !
Elles sont maintenant dlaisses au profit de WPF, qui permet de faire beaucoup plus de choses au niveau design. Cette
technologie allie notamment C# et XAML.
ce stade, je ne considre pas que vous ayez besoin de connatre WPF, les WinForms permettent quand mme de faire des
choses intressantes et esthtiques. Nous verrons WPF dans la partie III qui lui sera d'ailleurs exclusivement rserve. En
revanche, je ne dtaillerai pas tous les contrles utilisables avec les WinForms. Je vous invite donc les dcouvrir par vous-
mmes dans la bote outils.
www.openclassrooms.com
Partie 2 : Notions importantes 97/132
Les vnements
On appelle vnement une action particulire qui a lieu. Cela peut tre un clic de souris, l'appui d'une touche du clavier, ... Il existe
une infinit d'vnements puisque vous pouvez mme crer les vtres. Dans ce chapitre, je souhaite vous apprendre le
fonctionnement des vnements et vous montrer des exemples de base.
Les gestionnaires d'vnements
But
Ce que l'on veut, c'est effectuer une action lorsqu'un certain vnement est dclench. Pour cela, il faut dj savoir quand est
dclench l'vnement dont il est question.
C'est ici qu'entrent en jeu les gestionnaires d'vnements ("event handlers" en anglais). Il servent indiquer que l'vnement
surveill vient d'tre dclench.
Fonctionnement
Le principe est simple : on attache un gestionnaire d'vnements un vnement (on dit que l'on s'abonne l'vnement) en
spcifiant une mthode. Cette mthode est appele lorsque l'vnement est dclench.
Reprenons notre fameux bouton ; double-cliquez dessus : cela va crer un gestionnaire d'vnements. Voici le code gnr (par le
double-clic) dans Form1.Designer.cs :
Code : C#
this.m_myTestButton.Click += new
System.EventHandler(this.m_myTestButton_Click);
La proprit Click de mon bouton m_myTestButton est un gestionnaire d'vnements, cela signifie que des mthodes vont
tre appeles par m_myTestButton chaque fois que je clique dessus, en l'occurrence la mthode appele est
m_myTestButton_Click.
Code : C#
Cela dfinit une fonction prive, qui ne retourne rien et prend en paramtres deux choses :
Modifions le texte crit dans notre bouton ! Un objet de type Button contient une proprit appele Text qui correspond au
texte affich dans ce bouton. Compltez donc la mthode prcdente comme suit :
Code : C#
Appuyez sur F5 pour compiler la solution et lancer le programme en mode debug. Cliquez sur le bouton et l vous verrez que le
texte a chang.
www.openclassrooms.com
Partie 2 : Notions importantes 98/132
Code : C#
this.m_myTestButton.Click += new
System.EventHandler(this.m_myTestButton_Click);
Si vous laissez la souris sur le mot Click juste derrire this.m_myTestButton., un petit rectangle contenant des
descriptions apparat ; on appelle a une infobulle (tooltip en anglais). Cette infobulle vous dit que Click est de type
System.EventHandler, qu'il est dfini dans la classe Control (Button drive de Control) et on vous dit "Occurs
when the control is clicked." ("se produit quand l'utilisateur clique sur le contrle").
Le += signifie que vous ajoutez une action effectuer si l'vnement est dclench. En l'occurrence on ajoute un gestionnaire
d'vnements qui appellera la mthode m_myTestButton_Click.
De mme, -= signifie que vous enlevez une action effectuer si l'vnement est dclench.
Vous pouvez mettre la suite plusieurs lignes similaires la prcdente ; ici je considre que DoSomething,
DoSomethingElse et DoAnotherThing sont des mthodes de la classe Form1 (cf. le "this") :
Code : C#
this.m_myTestButton.Click += new
System.EventHandler(this.DoSomething);
this.m_myTestButton.Click -= new
System.EventHandler(this.DoSomethingElse);
this.m_myTestButton.Click += new
System.EventHandler(this.DoAnotherThing);
Nous ne sommes pas obligs. Je les ai simplement mis car ils sont prsents dans le code automatiquement gnr (dans le fichier
Form1.Designer.cs) ; je voulais donc suivre la logique de prsentation de code. En revanche, si je devais utiliser les gestionnaires
d'vnements pour quelque chose qui n'a rien voir avec le rendu visuel, je ne les mettrais pas dans Form1.Designer.cs et je
n'utiliserais pas this.
Exemples d'vnements
Click est loin d'tre le seul vnement de notre bouton. Pour voir tous ses vnements, ouvrez votre Form1 en mode Design
et slectionnez le bouton pour voir ses proprits dans la fentre Properties (assurez-vous que l'clair de cette fentre est
slectionn) :
www.openclassrooms.com
Partie 2 : Notions importantes 99/132
vnements lis au bouton (le bouton avec l'image d'clair doit tre activ).
Image 020.040.10000
Les noms sont intuitifs et comme vous pouvez le constater, il suffit de slectionner un vnement pour voir sa description en
bas. Double-cliquer sur un vnement gnre automatiquement le code du gestionnaire d'vnement et de la mthode appeler.
tudions prsent cette mthode.
Les paramtres passs
Le code de la mthode gnre automatiquement est :
Code : C#
Vous pouvez enlever l'exception, cette ligne est mise par mesure de scurit pour ne pas oublier de mettre du code.
La mthode prend en entre deux paramtres, ni plus ni moins. Le premier, de type object, correspond l'envoyeur ; le second,
de type EventArgs, correspond aux arguments de lvnement.
Envoyeur
Il s'agit d'une rfrence vers l'objet qui a envoy l'vnement (ici c'est notre bouton) et qui a t stock sous le type object.
Vous pouvez donc par exemple modifier le texte du bouton comme ceci :
Code : C#
www.openclassrooms.com
Partie 2 : Notions importantes 100/132
Si vous ne matriser pas bien les casts, revoyez le chapitre "Effectuer des conversions". Ici, cette faon de faire est inutile,
puisque vous savez qu'il s'agit de m_myTestButton, donc faites plutt :
Code : C#
Dans ce cas prcis, sender ne nous sert pas, mais il peut tout de mme tre utile. Prenons un exemple. Placez un 2e bouton sur
votre fentre et nommez-le m_myTestButton2.
Pour voir qui est qui, mettez le nom de chaque bouton dans la proprit Text (faisable via la fentre Properties, ou alors
directement dans le code).
Slectionnez la mme mthode pour l'vnement Click :
On associe le gestionnaire d'vnements Click du deuxime bouton la mme mthode que le premier.
Image 020.040.20000
www.openclassrooms.com
Partie 2 : Notions importantes 101/132
Ajoutez un contrle de type label votre fentre ; vous pouvez trouver ce contrle dans la bote outils, dans Common
Controls. Ce contrle permet d'afficher du texte. Nommez-le m_statusLabel. Mettez la proprit AutoSize false pour
choisir sa taille (sinon il prend la taille du texte qu'il contient). Mettez sa proprit Text "Aucun bouton cliqu.".
Slectionnez TextAlign et cliquez sur le rectangle du milieu. TextAlign doit valoir MiddleCenter prsent (vous
l'aurez compris, en place notre texte au beau milieu du label). Modifiez notre mthode comme ceci :
Code : C#
Maintenant lancez le programme et cliquez sur les boutons pour admirer le rsultat :
Arguments d'vnement
Ce paramtre contient des informations relatives l'vnement. Avec le gestionnaire d'vnements Click, ces informations
sont de type EventArgs et ne contiennent rien qui nous intresse. Nous allons donc tester le gestionnaire d'vnements
MouseClick.
La diffrence est que l'vnement li Click est dclench quand le bouton est cliqu, ce qui peut se faire de diverses
manires, notamment en appuyant sur la touche Entre quand le bouton a le focus (quand il est slectionn), alors que
l'vnement li MouseClick n'est dclench que lorsque le bouton est cliqu avec la souris.
Ouvrez Form1.cs en mode Design et double-cliquez sur "MouseClick" pour faire gnrer le gestionnaire d'vnements et la
mthode associe. Dans le corps de la mthode, tapez : e. et regardez ce que propose l'IntelliSense ; vous voyez les mmes
mthodes qu'avec un objet de type EventArgs ainsi que de nouvelles proprits, dont Location. Modifiez le code comme
ceci :
www.openclassrooms.com
Partie 2 : Notions importantes 102/132
Code : C#
Et admirez le rsultat :
D'autre part, comme mentionn dans l'introduction de ce chapitre, vous avez la possibilit de crer vos propres vnements.
C'est un peu plus compliqu car il faut voir d'autres notions ; je prfre ainsi vous expliquer cela plus loin dans ce cours.
Dans le chapitre suivant, je vais vous apprendre travailler avec le temps et nous nous servirons des vnements ; vous devez
donc bien les matriser. Nous y verrons, avec le contrle Timer, la notion de paralllisme dans les vnements.
www.openclassrooms.com
Partie 2 : Notions importantes 103/132
Citation : http://msdn.microsoft.com/fr-fr/library/system.datetime(VS.80).aspx
Le type DateTime reprsente des dates et des heures dont la valeur est comprise entre 00:00:00 (minuit), le 1er janvier de
l'anne 0001 de l're commune et 23:59:59, le 31 dcembre de l'anne 9999 aprs J.C. (re commune).
Les valeurs de date sont mesures en units de 100 nanosecondes, appeles graduations, et une date spcifique correspond
au nombre de graduations coules compter de 00:00 (minuit), le 1er janvier de l'anne 0001 aprs J.C. de l're commune
dans le calendrier GregorianCalendar. Par exemple, une valeur de graduations gale 31241376000000000L reprsente
la date du vendredi 1er janvier 0100 00:00:00 (minuit). Une valeur DateTime est toujours exprime dans le contexte d'un
calendrier explicite ou par dfaut.
Valeurs DateTime
Dans le type DateTime, les valeurs d'heure sont souvent exprimes en heure universelle (UTC), prcdemment connue
sous le nom d'heure de Greenwich (GMT). Le temps universel coordonn est l'heure mesure la longitude zro, le point de
dpart de l'UTC. L'heure d't ne s'applique pas l'UTC.
L'heure locale est relative un fuseau horaire particulier. Un fuseau horaire est associ un dcalage horaire, qui est le
dcalage du fuseau horaire mesur en heures par rapport au point de dpart UTC. De plus, l'heure locale peut en option tre
affecte par l'heure d't, qui ajoute ou soustrait une heure de la journe. Par consquent, l'heure locale est calcule en
ajoutant l'offset de fuseau horaire l'UTC et en rglant l'heure d't si ncessaire. Le dcalage horaire au point de dpart de
l'UTC est nul.
L'heure UTC est approprie pour les calculs, les comparaisons et l'enregistrement des dates et heures dans les fichiers.
L'heure locale est approprie pour l'affichage dans les interfaces utilisateur.
Si la proprit Kind d'un objet DateTime est Unspecified, rien ne spcifie si l'heure reprsente est locale ou UTC.
Les membres DateTime individuels adaptent l'heure non spcifie ce membre.
Oprations DateTime
Les oprations de conversion entre l'heure locale et l'heure UTC tiennent compte de l'heure d't, contrairement aux
oprations arithmtiques et aux comparaisons.
Les calculs et les comparaisons d'objets DateTime n'ont de signification que si les objets reprsentent les heures dans le
mme fuseau horaire. Pour cette raison, si aucun fuseau horaire n'est spcifi pour les objets, le dveloppeur dispose
probablement d'un mcanisme externe, par exemple une variable ou une stratgie explicite, qui lui permet d'tablir dans quel
fuseau horaire un objet DateTime a t cr.
Les oprations effectues par les membres du type DateTime prennent en considration des lments tels que les annes
bissextiles et le nombre de jours d'un mois.
C'est bien beau tout a, mais vu qu'un exemple est toujours plus parlant :
Code Description
Date d'aujourd'hui entre " la main" dans une mthode. new sert appeler le
new DateTime(2009, 8, 8) constructeur.
8 aot 2009 00:00:00
www.openclassrooms.com
Partie 2 : Notions importantes 104/132
DateTime.Today
8 aot 2009 00:00:00
Date et heure d'aujourd'hui sur mon PC (heure locale) obtenues par une proprit de
DateTime.Now DateTime.
8 aot 2009 22:55:37
Date et heure d'aujourd'hui sur mon PC (heure universelle UTC) obtenues par une
DateTime.UtcNow proprit de DateTime.
8 aot 2009 20:55:37
Date de demain obtenue par une mthode de DateTime (il se trouve que la proprit
DateTime.Today.AddDays(1) DateTime.Today est de type DateTime).
9 aot 2009 00:00:00
Maintenant, lorsqu'il s'agit d'afficher sous forme d'une chane de caractres un objet DateTime :
TimeSpan
Citation : http://msdn.microsoft.com/fr-fr/library/system.datetime(VS.80).aspx
DateTime et TimeSpan
Les types DateTime et TimeSpan se distinguent par le fait que DateTime reprsente un instant, tandis que
TimeSpan reprsente un intervalle de temps. Cela signifie, par exemple, que vous pouvez soustraire une instance
DateTime d'une autre pour obtenir l'intervalle de temps les sparant. De la mme faon, vous pouvez ajouter un
TimeSpan positif au DateTime en cours pour calculer une date ultrieure.
Vous pouvez ajouter ou soustraire un intervalle de temps d'un objet DateTime. Les intervalles de temps peuvent tre
ngatifs ou positifs ; ils peuvent tre exprims en units telles que les graduations ou les secondes ou comme un objet
TimeSpan.
Il n'y a pas tellement plus dire, l'IntelliSense vous propose de toute faon ce que vous pouvez faire...
Toutefois, pour vous montrer ce que a donne en exemple, je vais vous montrer comment dterminer le temps d'excution de
votre programme. Votre programme commence dans la mthode Main du fichier Program.cs. Modifiez-le comme ceci :
Code : C#
www.openclassrooms.com
Partie 2 : Notions importantes 105/132
exeDuration.Hours,
exeDuration.Minutes,
exeDuration.Seconds,
exeDuration.Milliseconds);
MonthCalendar
Voici quoi il ressemble (cf. image 020.050.20000) :
Voici quoi ressemble ce qui est cr automatiquement suite au double-clic (cela Rendu visuel d'un MonthCalendar.
dpend du nom de votre MonthCalendar) : Image 020.050.20000
Code : C#
this.monthCalendar1.DateChanged += new
System.Windows.Forms.DateRangeEventHandler(this.monthCalendar1_DateChanged);
Code : C#
DateTimePicker
un Timer serveur que vous pouvez ajouter la bote outils (cf. MSDN) ;
un Timer Windows, toujours disponible dans la bote outils (cf. MSDN) ;
un Timer thread, disponible par programme (cf. MSDN) ;
Nous emploierons le Timer Windows, optimis pour une utilisation dans les applications Windows Forms, et qui se trouve par
consquent dans l'espace de noms System.Windows.Forms.
Ce Timer est le moins prcis des trois : sa prcision est limite 55 millisecondes. Cependant, pour nous c'est suffisant.
www.openclassrooms.com
Partie 2 : Notions importantes 106/132
Interval : entier reprsentant la dure (exprime en millisecondes) entre deux tics. Par dfaut cette dure vaut 100ms.
Start : mthode qui dmarre le Timer.
Stop : mthode qui arrte le Timer.
Tick : gestionnaire d'vnements qui lance un vnement chaque tic.
Place la dmonstration. Le gestionnaire d'vnements est situ dans Form1.Designer.cs si vous l'avez fait gnrer
automatiquement ; sinon incluez-le dans la mthode Form1 (le constructeur).
Code : C#
// Constructeur
public Form1()
{
// ne mettre ici que si ce n'est pas dj dans
Form1.Designer.cs
s_myTimer.Tick += new EventHandler(s_myTimer_Tick);
MessageBox.Show("Timer lanc.");
}
if (s_myCounter >= 5)
{
// Si le Timer est en marche...
if (s_myTimer.Enabled)
{
s_myTimer.Stop();
MessageBox.Show("Timer stopp.");
}
else
{
MessageBox.Show("Timer dj stopp.");
}
}
}
}
Votre fentre possde deux champs, un Timer nomm s_myTimer et un entier nomm s_myCounter, qui sont statiques.
Des membres non statiques sont caractristiques d'une instance (objet particulier fait sur le modle d'une classe). Chaque
www.openclassrooms.com
Partie 2 : Notions importantes 107/132
instance possde ces membres, mais leurs valeurs ne sont pas ncessairement les mmes.
Des membres statiques sont communs toutes les instances d'une classe.
Ainsi, dans cet exemple, plusieurs fentres (qui sont des instances de votre classe Form1 drivant de Form) peuvent tre
crs, mais elles ont toutes le mme Timer nomm s_myTimer et le mme entier nomm s_myCounter.
En mettant s_myCounter++; avant, chaque seconde on commence par incrmenter s_myCounter, donc l si vous ne
faites rien, vous voyez "s_myCounter vaut 0.", puis "s_myCounter vaut 1.", ...
Si vous ne cliquez jamais sur OK, les fentres vont apparatre l'infini !
La proprit Enabled indique si le Timer est en marche ou non. Si Enabled vaut true, il est en marche, sinon ce n'est pas
le cas.
Vous pourriez me dire que ce test est inutile, car si s_myCounter est suprieur ou gal 5, il n'a jamais t arrt, car sinon
l'vnement n'aurait pas t dclench. En fait, les vnements sont fourbes cause du paralllisme implicitement cr. Sachez
qu'un bon code est un code qui prvoit toutes les situations, et surtout celle qui sont les plus tordues ! Comme on dit, Never
Trust User Input...
Voici un exemple farfelu o le test a du sens : je lance le programme, j'attends 10 secondes donc 10 fentres s'affichent. Chaque
fois qu'un vnement est dclench, une "version parallle" du programme qui s'excute. Chacune de ces "versions" est bloque
MessageBox.Show(...); car elle attend que je ferme la fentre pop-up. Je dcide de fermer une fentre (peu importe
laquelle) ; le code de la "version" correspondante se poursuit donc. s_myCounter est bien suprieur ou gal 5 donc on
entre dans le bloc if. Le Timer est activ donc on l'arrte et on prvient l'utilisateur. Je dcide de fermer une autre fentre. Le
code de cette "version" continue lui aussi. Il entre dans le bloc if mais l le Timer est dj bloqu, donc on prvient
l'utilisateur.
On peut vouloir que sans action de l'utilisateur, le Timer s'arrte quand mme au bout de 5 secondes. Dans ce cas le code
devient :
Code : C#
if (s_myCounter >= 5)
{
// Si le Timer est en marche...
if (s_myTimer.Enabled)
{
s_myTimer.Stop();
MessageBox.Show("Timer stopp.");
}
else
{
MessageBox.Show("Timer dj stopp.");
}
}
www.openclassrooms.com
Partie 2 : Notions importantes 108/132
Dans le prochain TP nous utiliserons les connaissances que vous venez d'acqurir (j'ose esprer que je n'aurais pas d dire "que
vous auriez d acqurir..." ).
Allez, on continue travailler et on s'accroche ! Vous ne croyiez quand mme pas que vous pourriez vous contenter de lire en
restant passifs !
www.openclassrooms.com
Partie 2 : Notions importantes 109/132
Pensez ceux qui utiliseront vos programmes (ne serait-ce qu' vous-mmes) ! Imaginez qu' cause d'une erreur interne, le
programme est ferm et manque de chance vous n'aviez pas sauvegard : c'est pour le moins agaant.
Grer les exceptions permet de rendre votre programme plus stable et c'est un moyen simple pour viter de se mettre des
utilisateurs dos.
Lancer er intercepter des exceptions
Lancer une exception
Une exception est comme une alerte, le but est d'viter une mauvaise opration. L'intrt de lancer une exception est que du code
ait t prvu pour la grer, sinon votre programme s'arrte brutalement. Vous pouvez vous-mmes lancer des exceptions, lorsque
vous jugez que c'est ncessaire.
Pour ce faire, il suffit de faire throw new nomDeLexception();. Vous pouvez aussi passer des paramtres au
constructeur comme l'IntelliSense vous le suggre, par exemple :
Code : C#
Utilisez le type d'exception qui convient. Vous voyez qu'ici je lance une erreur parce que le code n'a pas encore t crit,
et que l'exception est de type NotImplementedException, qui peut se traduire par "exception de non
implmentation" (implmenter = mettre sous forme de code).
Lorsque vous voulez excuter du code susceptible d'tre source d'erreur, enfermez-le dans un bloc try.
Vous pouvez intercepter l'exception avec un (ou plusieurs) bloc(s) catch.
Enfin, vous pouvez utiliser un bloc finally pour effectuer systmatiquement une opration aprs la tentative d'excution.
Un bloc try doit imprativement tre suivi d'au moins un bloc (catch ou finally).
Vous ne pouvez mettre qu'un seul bloc try et qu'un seul bloc finally.
Code : C#
try
{
Console.Write("Entrez un nombre : ");
int n = int.Parse(Console.ReadLine());
Console.WriteLine(
"100/nombre = {0}",
100/n);
}
catch (DivideByZeroException dbzEx)
{
Console.WriteLine("Erreur : division par zro.");
}
catch (Exception ex)
{
Console.WriteLine(
"Une autre exception a eu lieu : {0}.",
ex.Message);
}
finally
{
www.openclassrooms.com
Partie 2 : Notions importantes 110/132
Lorsque vous voulez juste savoir si une exception d'un certain type est lance, sans avoir d'autres informations sur
cette exception, vous pouvez ne prciser que le type de l'exception (sans prciser de nom de variable) dans le catch.
Ainsi, comme nous n'utilisons pas dbzEx dans l'exemple prcdent, nous pouvons simplement crire catch
(DivideByZeroException) au lieu de catch (DivideByZeroException dbzEx).
Crer ses propres exceptions
Pour crer vos propres exceptions, vous devez crer une classe qui drive de la classe Exception. Voici un exemple :
Code : C#
public MyException()
: base("Message par dfaut de l'exception.")
{
m_errorTime = DateTime.Now;
s_errorNumber++;
}
Code : C#
try
{
// Code dangereux
}
catch (MyException ex)
{
ex.DisplayError();
}
www.openclassrooms.com
Partie 2 : Notions importantes 111/132
www.openclassrooms.com
Partie 2 : Notions importantes 112/132
Les interfaces
Une interface est un modle de classe. Elle contient des mthodes et des proprits, avec la particularit qu'elle ne fournit pas
l'implmentation des mthodes. Cela veut dire qu'on dcrit juste les mthodes sans dcrire ce qu'elles font.
Une interface ne sert rien toute seule : chaque interface est voue tre implmente par une classe (ou une structure) qui
devra implmenter ses mthodes et possder ses proprits. Le but d'une interface est de dfinir les mthodes et proprits
proposes par toute classe (ou structure) qui l'implmente, sans que le dveloppeur ait besoin de savoir comment celles-ci sont
codes. Pour faire simple, une interface est comme un contrat : elle dfinit des attentes sans prvoir les solutions techniques qui
seront utilises.
Crer une interface
La dclaration d'une interface ressemble celle d'une classe, avec quelques diffrences. On utilise notamment le mot-clef
interface la place du mot-clef class.
Par convention, le nom d'une interface commence toujours par un 'i' majuscule. Cela permet de s'y retrouver dans son
code, ce qui est indispensable.
En termes d'accessibilit, une interface est toujours publique, vous ne pouvez donc pas utiliser de restricteur d'accs (public,
private, protected ou internal)
Code : C#
interface IAnimal
{
string Name { get; }
void Move();
}
Grce cela, on sait qu'un objet stock sous forme de IAnimal aura toujours la proprit Name accessible en lecture et la
mthode Move.
Il faut simplement mettre get; et non pas get { return m_name; } car l'interface ne connat pas m_name et s'en fiche.
Encore une fois, ce qui compte ce sont les fonctionnalits disposition, et non pas comment elles sont codes. D'ailleurs, qui
vous dit que le dveloppeur nommerait un champ avec m_ devant et pas simplement _ comme le font certains ?
Utiliser une interface existante
Toute classe implmentant une interface doit implmenter ses mthodes (avec les mmes signatures) et ses proprits. Au cas o
vous l'auriez oubli, la signature d'une mthode permet de l'identifier ; elle dpend de trois choses : son nom, son type de retour
et ses arguments.
Reprenons l'exemple prcdent. L'implmentation de Move devra donc aussi se nommer Move, retourner void, et ne prendre
aucun paramtre en entre.
Voici un exemple :
Code : C#
www.openclassrooms.com
Partie 2 : Notions importantes 113/132
Vous pouvez manipuler des objets avec le type de l'interface : vous n'tes pas obligs d'utiliser le type d'une classe qui
l'implmente ; vous pouvez donc mettre dans le Main :
Code : C#
Code : C#
Dans ce cas, si les deux interfaces dcrivent une mthode ayant la mme signature, elles appelleront toutes les deux la mme
mthode. Voyez plutt :
Code : C#
interface IControl
{
void Paint();
}
interface ISurface
{
void Paint();
}
class SampleClass : IControl, ISurface
{
public void Paint()
{
// Implmentation de Paint
}
}
class Program
{
static void Main(string[] args)
{
// Appel de Paint depuis IControl
IControl myControl = new SampleClass();
myControl.Paint();
www.openclassrooms.com
Partie 2 : Notions importantes 114/132
Dans les deux cas, la mme mthode Paint est appele. Pour faire deux mthodes diffrentes, il faut remplacer le code de
SampleClass par :
Code : C#
Vous remarquez au passage que je n'ai pas mis d'accesseur devant les deux mthodes alors que j'avais mis un public tout
l'heure. tant donn que cette fois il s'agit de mthodes qui implmentent chacune une interface spcifique, elles sont forcment
publiques car elles ne pourront tre utilises que depuis des interfaces.
Vous pouvez alors faire :
Code : C#
obj.Paint(); produirait une erreur la compilation car nous n'avons pas cr de mthode "gnrale" Paint. C'est
toutefois faisable si l'on implmente un Paint "gnral" :
Code : C#
Dans ce cas, c.Paint(); appelle encore IControl.Paint et n'appelle pas la mthode "gnrale" justement car on a fait
www.openclassrooms.com
Partie 2 : Notions importantes 115/132
www.openclassrooms.com
Partie 2 : Notions importantes 116/132
Parce que c'est la faon la plus simple de stocker des informations l'extrieur d'un programme. Ensuite, ces informations
peuvent tre utilises n'importe quand (sans que le programme qui les a cres ne soit oblig de fonctionner) et par n'importe
quel programme qui sait lire le fichier en question.
Un fichier possde un nom que se termine par un point suivi de quelques lettres (en gnral 2 4), comme ceci : "exemple.txt".
Ces quelques lettres reprsentent l'extension du fichier. Votre OS (systme d'exploitation) reconnat les extensions et sait quels
programmes y sont associs.
Ainsi, un fichier ".txt" est un fichier texte qui s'ouvrira automatiquement avec un diteur de texte.
De mme, un fichier ".png" reprsente une image et sera trait comme telle.
L'erreur que font beaucoup de gens est de croire que modifier l'extension d'un fichier suffit le convertir.
C'est totalement faux : l'extension d'un fichier n'affecte en rien son contenu. Comme je vous l'ai dit, cela affecte
uniquement la manire dont votre OS se comporte avec ce fichier : quelle icne va tre affiche ct, ...
Tous les fichiers sont stocks en binaire : une succession de bits (0 ou 1) qui forment des octets (1 octet = 8 bits).
Ces octets sont en fait des nombres crits en base 2. ils peuvent reprsenter tout et n'importe quoi : du texte, du son, une image,
...
Nous avons l'habitude de travailler en base 10 : il y a dix chiffres (de 0 9) et le nombre abc en base 10 (pas a*b*c !) reprsente
a*102 + b*101 + c*100 , ce qui fait 100*a + 10*b + c.
De mme abc en base 2 reprsente a*22 + b*21 + c*20 , ce qui fait 4*a + 2*b + c. Ainsi, 1001 en base 2 correspond 9 en base 10.
Un octet va de 0000 0000 jusqu' 1111 1111 en base 2, soit de 0 255 (il y a 8 bits : nombre max = 28 - 1) en base 10.
Pour coder les caractres, le code ASCII a l'origine t mis en place. Il y avait cependant un problme : les accents n'existent
pas en anglais et n'ont pas t traduits en code ASCII. Ce code a donc volu depuis et a t complt par d'autres.
Unicode est le code universel actuel. Vous avez d'ailleurs srement dj entendu parler de l'encodage UTF-8, qui est un format de
codage de caractres dfini pour les caractres Unicode.
Voici un fichier texte ouvert en mode binaire avec Textpad (ce n'est pas vraiment du binaire, c'est de l'hxadcimal) :
0000 0000 0 00
www.openclassrooms.com
Partie 2 : Notions importantes 117/132
0000 0001 1 01
0000 0010 2 02
0000 0011 3 03
0000 0100 4 04
0000 0101 5 05
0000 0110 6 06
0000 0111 7 07
0000 1000 8 08
0000 1001 9 09
0000 1010 10 0A
0000 1011 11 0B
0000 1100 12 0C
0000 1101 13 0D
0000 1110 14 0E
0000 1111 15 0F
0001 0000 16 10
0001 0001 17 11
Le code de la premire lettre est 56 en hexadcimal (l'indice entre parenthses est la base) :
Vous remarquez au passage que 5(16) = 0101(2) et 6(16) = 0110(2). C'est normal : 24 = 16 donc ce que l'on code avec 4 chiffres en
base 2, on le code avec un seul en base 16 : 50(16) = 0101 0000(2).
Les quatre premiers bits (en partant de la droite) reprsentent un nombre compris entre 0 et 15 : en base 16 cela reprsente les
units ; les quatre derniers reprsentent un nombre entre 16 et 255 : en base 16 cela reprsente les "seizaines".
Dans la page du code ASCII sur Wikipdia (voir lien ci-dessus), vous voyez que cela correspond au caractre 'V' : l'diteur de
texte affiche donc un 'V'.
Si vous changez l'extension d'une image en ".txt", vous pourrez voir plein de caractres qui ne veulent rien dire, eh oui le code
binaire dcrit des informations concernant l'image, ce n'est pas du texte. L'diteur affiche les caractres correspondant au code,
mais cela ne reprsente rien pour nous autres humains.
Vous voyez donc que modifier l'extension d'une image en ".txt" va juste faire que le fichier sera affich comme tant du texte et
non comme tant une image ; les donnes en elles-mmes ne sont pas affectes.
Lire et crire via des botes de dialogue
Lire
www.openclassrooms.com
Partie 2 : Notions importantes 118/132
Nous allons travailler avec des objets de type Stream ("stream" en anglais = "flux" en franais), qui reprsentent des flux
d'octets.
Ne confondez pas byte et bit (qui vient de "binary digit") : 1 octet = 8 bits (= 1 byte en gnral). Contrairement ce que
croient normment de personnes, "octet" n'est pas la traduction franaise du mot anglais "byte", mais de "octet" :
c'est le mme mot dans les deux langues. Un byte est la plus petite unit d'adressage mmoire d'un ordinateur et il se
trouve que cette unit correspond un octet, c'est--dire huit bits ; cependant on pourrait dcider qu'un byte vaut plus
(ou moins) de huit bits. Par abus de langage, on fait trs souvent la confusion ; l'important est d'en avoir conscience.
Un flux est une connexion entre diffrents entits ; il transporte les donnes qu'elles s'changent. On peut crire des donnes
dans le flux ou lire celles qui circulent dj. Ici nous allons effectuer une connexion entre notre programme et l'espace de
stockage de notre ordinateur.
Pour lire un fichier en utilisant les botes de dialogue, vous allez avoir besoin d'un objet de type OpenFileDialog, ici nomm
openFileDialog1 (ici le nom n'est pas fabuleux car il s'agit simplement d'un exemple ; dans un vrai programme, nommez-le en
fonction de ce quoi il sert).
Pour en crer un, prenez-le dans la bote outils et mettez-le sur votre fentre. Ce n'est pas un objet qui s'affiche dans la fentre,
il va donc se mettre en-dessous de votre fentre dans le mode Design.
Comme d'habitude, je vous donne d'abord le code (qui est mettre dans une mthode) et ensuite je vous explique tout :
Code : C#
string fileName;
string fileContent;
// On lit le fichier.
fileContent = File.ReadAllText(fileName);
}
// En cas d'erreur...
catch (Exception ex)
www.openclassrooms.com
Partie 2 : Notions importantes 119/132
{
MessageBox.Show("Une erreur est survenue lors de l'ouverture du
fichier : {0}.", ex.Message);
}
}
La classe File est situe dans l'espace de noms System.IO, n'oubliez donc pas le using System.IO; en dbut
de fichier.
Les quelques premires lignes ne devraient pas poser trop de problmes : on modifie simplement quelques proprits de la bote
de dialogue. C'est dans le if que a devient intressant. L'ordinateur value openFileDialog1.ShowDialog() ==
DialogResult.OK pour obtenir un boolen. En fait, tout se passe comme si == tait une mthode prenant deux arguments
en entre et retournant un boolen ; on pourrait avoir ==(openFileDialog1.ShowDialog(), DialogResult.OK).
Je pense qu'on comprend mieux ce qui se passe avec cette criture. Donc nous tions en train de dire que nous voulions valuer
cette expression. Pour cela, il faut commencer par valuer les arguments. DialogResult.OK est dj une valeur, donc pas de
soucis. Par contre ShowDialog est une mthode : il faut donc l'appeler et excuter le code qu'elle contient pour obtenir un
rsultat qui servira pour le ==.
ShowDialog affiche une bote de dialogue contenant un explorateur de fichiers et qui attend que vous en choisissiez un ou
plusieurs (ici on a interdit d'en choisir plusieurs). Elle retourne un objet de type DialogResult (une numration) qui donne
des informations sur ce qu'a fait l'utilisateur. Cet objet peut valoir DialogResult.OK si l'utilisateur a bien choisi un fichier et
qu'il n'a, par exemple, pas annul. C'est prcisment ce que l'on teste dans le if : on vrifie qu'un fichier a t choisi avant
d'essayer d'y accder.
Rcapitulons : dans l'ordre chronologique on commence par afficher la bote de dialogue et on attend que l'utilisateur fasse
quelque chose : le programme est bloqu la mthode ShowDialog. Ensuite on compare le rsultat de cette mthode avec
DialogResult.OK l'aide de l'oprateur == : si l'utilisateur a choisi un fichier alors on excute le code du bloc if.
Continuons l'analyse : on rcupre d'abord le nom du fichier choisi puis on lit le fameux fichier en utilisant la mthode
File.ReadAllText qui ouvre le fichier, le lit en entier, le ferme et retourne son contenu. En une seule ligne, on rassemble des
actions que nous pouvons sparer.
Dans cet exemple j'ai utilis la mthode File.ReadAllText. Comme son nom l'indique, on lit les donnes en faisant comme
si c'tait du texte ; nous d'tre srs que nous lisons du texte, sinon nous obtiendrons une suite de caractres sans aucun sens.
Suivant ce que l'on veut faire avec le fichier, on peut utiliser d'autres mthodes ou classes. Trs souvent, on utilise des objets de
type Stream (ou des types qui en drivent). Cette classe est aussi situe dans l'espace de noms System.IO, il faut donc
mettre using System.IO; en dbut de fichier. Voici comment on peut faire avec cette nouvelle classe : je remplace juste la
ligne fileContent = File.ReadAllText(fileName); par :
Code : C#
// Lecture
fileContent = reader.ReadToEnd();
}
catch
{
Console.WriteLine("Something went wrong!");
}
finally
{
// Fermeture
www.openclassrooms.com
Partie 2 : Notions importantes 120/132
if (reader != null)
{
reader.Dispose();
}
if (myStream != null)
{
myStream.Dispose();
}
}
Ici on a spar ouverture, lecture et fermeture. Vous pouvez utiliser le mot-clef using pour appeler automatiquement la fin du
bloc correspond la mthode Dispose de l'objet entre parenthses :
Code : C#
try
{
// Ouverture
using (Stream myStream = openFileDialog1.OpenFile())
{
using (StreamReader reader = new StreamReader(myStream,
Encoding.UTF8))
{
// Lecture
fileContent = reader.ReadToEnd();
}
// La mthode Dispose de reader vient d'tre appele.
}
// La mthode Dispose de myStream vient d'tre appele.
}
catch
{
Console.WriteLine("Something went wrong!");
}
Le mot-clef using remplace seulement try et finally, il ne remplace pas catch ! Si jamais une exception est
lance dans le bloc using et que vous ne l'interceptez pas avec un catch, votre programme va devoir s'arrter. En
revanche, l'intrt du mot-clef using est que les flux seront ferms mme en cas d'exception. Cependant, si vous ne
grez pas les exceptions et que vous laissez Windows s'en occuper, votre programme peut tre arrt avant que les flux
soient ferms, ce qui n'est pas bon ; pour cela, on place en gnral un bloc using au sein d'un bloc try (sans oublier
le catch !).
Il est trs important de fermer un flux une fois que vous n'en avez plus besoin : cela libre de la mmoire et cela permet de ne pas
monopoliser l'accs la ressource en question (d'autres programmes en ont peut-tre besoin).
L'objet auquel on applique using doit implmenter l'interface IDisposable. Pour savoir si c'est le cas, faites un
clic-droit sur le type de l'objet, puis cliquez sur "Go To Definition". Cela vous emmne la dfinition de la classe. Voici
ce que cela donne avec le type Stream :
www.openclassrooms.com
Partie 2 : Notions importantes 121/132
Vous voyez que la classe Stream implmente bien l'interface IDsiposable et propose bien une mthode Dispose.
Voici le code complet de la deuxime version (je le rpte : ce code est mettre dans une mthode) :
Code : C#
string fileName;
string fileContent;
if (myStream != null)
{
using (myStream)
{
www.openclassrooms.com
Partie 2 : Notions importantes 122/132
J'utilise ici l'encodage UTF-8, mais vous pouvez en choisir un autre dans la classe Encoding.
Si vous faites un clic-droit sur StreamReader et que vous cliquez ensuite sur "Go To Definition", vous aurez accs aux
mtadonnes, dans lesquelles vous pourrez lire :
Code : C#
// Summary:
// Implements a System.IO.TextReader that reads characters from a
byte stream
// in a particular encoding.
[Serializable]
[ComVisible(true)]
public class StreamReader : TextReader
Vous voyez que le commentaire prcise que l'on lit des caractres, autrement dit du texte. Si nous voulions lire des donnes
brutes, nous n'aurions pas besoin de StreamReader et nous pourrions nous contenter de l'objet myStream.
crire
Pour crire dans un fichier, le principe va tre peu prs le mme car nous allons encore utiliser une bote de dialogue. La
diffrence est qu'au lieu d'utiliser un contrle de type OpenFileDialog, nous allons utiliser SaveFileDialog.
Comme vous devez vous en douter, il vous suffit encore d'un simple glisser-dposer depuis la bote outils pour crer un objet
de type SaveFileDialog ; le mien gardera le pitre nom saveFileDialog1.
Voici maintenant comment crire la valeur de fileContent dans un fichier (le code suivant va dans une mthode) :
Code : C#
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
Stream myStream = saveFileDialog1.OpenFile();
if (myStream != null)
{
www.openclassrooms.com
Partie 2 : Notions importantes 123/132
using (myStream)
{
using (StreamWriter writer = new StreamWriter(myStream,
Encoding.UTF8))
{
writer.Write(fileContent);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Une erreur est survenue lors de l'criture du
fichier: {0}.", ex.Message);
}
}
La seule diffrence notoire est que nous utilisons ici un StreamWriter au lieu d'un StreamReader et la mthode Write
au lieu de ReadToEnd.
fileContent doit tre dclar et initialis avant que vous essayiez d'crire son contenu dans le fichier. Je ne l'ai pas
fait ici car je ne vous ai donn que le morceau concernant l'accs au fichier.
L encore, on s'intresse du texte et j'utilise l'encodage UTF-8 (vous pouvez en choisir un autre dans la classe Encoding).
J'ai port l'accent sur le traitement de fichiers texte, car c'est le plus facile. Sachez que vous pouvez bien videmment stocker tout
ce que vous voulez, du son, des images, des vidos, des donnes...
www.openclassrooms.com
Partie 2 : Notions importantes 124/132
Les collections
Les collections sont une alternative aux tableaux. La diffrence majeure est que la taille d'un tableau est fixe alors que celle d'une
collection peut varier : vous pouvez ajouter et enlever des lments.
Les collections utilisent la notion de gnricit ; je vais donc commencer ce chapitre par un aperu des gnriques. Ensuite, je
vous prsenterai les listes, les dictionnaires, et les piles. Enfin, je vous parlerai de l'expression foreach ... in.
Mthodes gnriques
Crer une mthode gnrique
Code : C#
Il est possible de mettre plusieurs types gnriques en les sparant par des virgules ; exemple :
Code : C#
Code : C#
www.openclassrooms.com
Partie 2 : Notions importantes 125/132
Classes gnriques
Vous pouvez avoir des classes gnriques. Il faut faire suivre le nom de la classe par <T> ; exemple :
Code : C#
// Constructeur
public GenericList()
{
m_head = null;
}
Les listes
Je vais vous parler de la classe gnrique List<T> (situe dans l'espace de noms System.Collections.Generic).
crivez juste List<string> dans le Main, faites un clic-droit sur List et cliquez sur "Go To Definition" pour voir sa
dfinition. Vous voyez public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>,
IList, ICollection, IEnumerable. La classe List implmente notamment l'interface ICollection<T>, c'est
donc une collection.
www.openclassrooms.com
Partie 2 : Notions importantes 126/132
significatives entre les deux. D'abord, la taille d'un tableau est fixe alors que la taille d'une liste est variable : vous pouvez ajouter
ou enlever des lments quand vous le souhaitez. De plus, une fois qu'un tableau est cr, vous avez des cases "fixes" ; dans
une liste, l'ordre des lments peut tre modifi comme on veut.
Code : C#
// Affichera 2.
Console.WriteLine(firstNameList.Count);
Les dictionnaires
Parlons un peu de la classe Dictionary<TKey, TValue> situe dans l'espace de noms
System.Collections.Generic. Un dictionnaire est une collection de paires clef/valeur, chaque clef tant unique. C'est
une classe doublement gnrique : il faut prciser le type des clefs et le type des valeurs. Nous allons ici travailler avec des clefs
et des valeurs qui seront des chanes de caractres, mais vous pouvez tout aussi bien choisir d'autres types.
Utiliser un dictionnaire
L'utilisation est proche de celle d'une liste, puisque les deux sont des collections. tudions un exemple de dictionnaire faisant
l'association entre une extension de fichiers et le programme utilis par dfaut pour ouvrir les fichiers portant cette extension :
www.openclassrooms.com
Partie 2 : Notions importantes 127/132
Code : C#
// Cration du dictionnaire.
Dictionary<string, string> openWith = new Dictionary<string,
string>();
www.openclassrooms.com
Partie 2 : Notions importantes 128/132
}
else
{
Console.WriteLine("La clef \"tif\" est introuvable.");
}
if (!openWith.ContainsKey("doc"))
{
Console.WriteLine("La clef \"doc\" est introuvable.");
}
Les piles
Intressons-nous maintenant la classe gnrique System.Collections.Generic.Stack<T>. Une pile ("stack" en
anglais) est une collection de type dernier entr premier sorti ("LIFO" en anlgais).
Fonctionnement
Concrtement, il s'agit d'une sorte de liste que vous remplissez au fur et mesure et dont seul le dernier lment insr est
accessible. Il n'y a donc pas d'indexeur ni de mthode Remove. Vous pouvez par contre utiliser la mthode Clear ou la
proprit Count. chaque fois que vous ajoutez un lment, il se place avant tous les autres. Certes, vous ne pouvez accder
qu' l'lment se trouvant au sommet de la pile, c'est--dire celui qui a t ajout en dernier ; toutefois, vous pouvez le
supprimer pour accder l'lment du dessous.
En pratique
Voici un exemple dans lequel j'utilise une pile d'entiers :
Code : C#
www.openclassrooms.com
Partie 2 : Notions importantes 129/132
numbers.Push(2);
numbers.Push(3);
numbers.Push(4);
Console.WriteLine(
"{0} lments ont t ajouts.",
numbers.Count);
foreach ... in
Prsentation
Le mot-clef foreach permet de parcourir des objets implmentant l'interface IEnumerable. La syntaxe est :
Code : C#
Comme dans une boucle for, vous pouvez utiliser break; pour sortir de la boucle ou continue; pour passer
l'lment suivant.
Exemples
Avec une liste
Code : C#
Code : Console
Matt
James
www.openclassrooms.com
Partie 2 : Notions importantes 130/132
Avec un dictionnaire
Il y a plusieurs faons de faire, suivant vos besoins. Un dictionnaire possde deux proprits intressantes :
Keys qui est de type Dictionary<TKey, TValue>.KeyCollection : c'est une collection qui contient les
clefs du dictionnaire.
Values qui est de type Dictionary<TKey, TValue>.ValueCollection : c'est une collection qui contient
les valeurs du dictionnaire.
Code : C#
Le rsultat est :
Code : Console
www.openclassrooms.com
Partie 2 : Notions importantes 131/132
bmp
dib
rtf
C'est comme avec une liste, sauf que la pile est parcourue de l'lment le plus rcent au plus vieux. L'ordre est donc invers et le
code suivant (o numbers est la pile prcdemment cre)...
Code : C#
...affichera :
Code : Console
4
3
2
1
0
Vous disposez maintenant d'une alternative aux tableaux. Faites-en bon usage !
J'espre d'une part vous avoir apport suffisamment de concret pour claircir vos ides, et d'autre part j'espre vous avoir donn
envie de continuer la lecture de ce tutoriel.
Dans la prochaine partie, nous nous attaquerons la GUI ("Interface Utilisateur Graphique") avec WPF. Nous allons donc
changer compltement de domaine, alors n'en profitez pas pour oublier ce que je vous ai dit dans cette partie !
Ce tutoriel est loin d'tre fini. Il me faudra du temps pour le terminer !
Prochaine partie prvue : "Crer des applications riches en design avec WPF". Vous y dcouvrirez la cration moderne et rapide
d'interfaces graphiques poustouflantes !
www.openclassrooms.com