Professional Documents
Culture Documents
Version 1.0
Z
[Date : 14/09/09]
Sommaire
1 2
Les Listes ................................................................................................................................ 13 Dclaration dune liste .................................................................................................. 13 Ajouter des lments la liste ...................................................................................... 13 Parcourir la liste ............................................................................................................ 14 Action sur la liste ........................................................................................................... 14
Les numrations .................................................................................................................. 15 Dclaration et initialisation ........................................................................................... 15 Utiliser une numration .............................................................................................. 15
3.4.1 3.4.2
[Date : 14/09/09]
Gestion des erreurs ............................................................................................................... 22 Importance de la gestion dexception ........................................................................... 22 try .................................................................................................................................. 23 catch .............................................................................................................................. 24 Finally............................................................................................................................. 25 Exception multiples ....................................................................................................... 26
Conclusion ........................................................................................................................ 28
[Date : 14/09/09]
1 Introduction
Ce chapitre des notions avances vient complter les connaissances acquises dans le prcdent chapitre concernant les notions fondamentales du langage c#. Nous allons prsenter les notions importantes savoir, les diffrentes structures de donnes et introduire ce que sont les mthodes et la gestion des exceptions.
[Date : 14/09/09]
Ce qui nous prouve bien que le compilateur slectionn le type appropri chaque variable.
[Date : 14/09/09]
Le cast implicite Le cast implicite est un cast qui ne pose aucun problme, car il nentraine pas de perte de donnes. Par exemple si on veut convertir un type int en un type long, la conversion ne posera jamais problme car le type long englobe le type int.
//C# static void Main(string[] args) { int age = 42; long longAge = age; //Ici on convertit notre int en long Console.WriteLine("Mon ge est : {0}",longAge); Console.ReadLine(); }
2.2.1.2
Le cast explicite Tout dabord nous allons essayer le code suivant et observer ce quil se passe.
//C# static void Main(string[] args) { float resultatPrecis = 17.83f; int resultat = resultatPrecis; Console.WriteLine("Le rsultat est : {0}", resultat); Console.ReadLine(); }
Dans le code ci-dessus, on essaie de stocker un rsultat deux chiffres aprs la virgule dans un entier. Comme vous pouvez limaginer, Visual Studio ne va pas compiler et nous renvoie un joli message derreur :
[Date : 14/09/09]
Pour viter ce message derreur et russir la compilation, il va nous falloir dfinir notre conversion de manire explicite. Pour cela, rien de plus simple, on va mettre devant notre variable, le type dsir entre parenthses, en loccurrence int . Ce qui nous donne :
//C# static void Main(string[] args) { float resultatPrecis = 17.83f; int resultat = (int)resultatPrecis; //Conversion explicite. Console.WriteLine("Le rsultat est : {0}", resultat); Console.ReadLine(); }
Le rsultat est : 17
On observe que notre conversion vers les entiers a bien supprim les chiffres aprs la virgule, sans effectuer aucun arrondi mais avec un effet de troncature. Il est noter quune conversion explicite peut galement se passer sans perte de donnes.
long
int Cast implicite short Cast explicite
Le schma ci-contre nous montre limbrication de quelques types de donns : Sbyte 2.2.2 Conversion dune chaine en nombre Ce type de conversion savre trs utile pour effectuer des oprations sur une chaine da caractres entre par lutilisateur.
Pour convertir une chane en nombre on va utiliser la fonction Parse prcde du type voulu. Par exemple si lon veut convertir x en entier on va faire int.Parse(x) si on le veut en dcimal on crira float.Parse(x) ou en long long.Parse(x) etc. Exemple :
[Date : 14/09/09]
//C# static void Main(string[] args) { //Deux chaines de caractres : string maChaineA = "42"; string maChaineB = "23"; //Conversion en entiers puis additon : int addition = int.Parse(maChaineA) + int.Parse(maChaineB); //Affichage et pause. Console.WriteLine(addition); Console.ReadLine(); }
65 La console nous renvoie 65 nous indiquant que la conversion et laddition sest bien droule. 2.2.3 Conversion dun nombre en chaine La conversion dun nombre vers une chaine de caractre seffectue grce la fonction ToString() que lon va placer la suite de notre variable convertir. Pour convertir notre nombre x on crira donc x.ToString() . Exemple :
//C# static void Main(string[] args) { int nombre = 256; //Conversion de nombre en chane: string ChaineNombre = nombre.ToString(); //Affichage et Pause: Console.WriteLine(ChaineNombre); Console.ReadLine(); }
2.2.4
Conversion en objet La conversion dune variable en objet est communment appele Boxing . Cette conversion nous permet de pouvoir prendre nimporte quel type de variable et la convertir pour pouvoir la manipuler comme un objet. Laction qui permet de retransformer lobjet en variable sappelle l Unboxing , littralement le sortir de la boite. Dotnet France Association
[Date : 14/09/09]
static void Main(string[] args) { int nombre = 12; //Boxing object MonObjet = nombre; //Unboxing int j = (int)MonObjet; }
Les donnes de type valeur sont stocks dans la pile. Les donnes de type rfrence sont stock dans une partie de la mmoire appele le tas tandis quune rfrence pointant vers celle-ci se trouve dans la pile.
10
[Date : 14/09/09]
LA PILE
LE TAS
Int monEntier = 42
Int*+ monTableau = ,-
...
Lgende
Type Valeur
Type Rfrence
11
[Date : 14/09/09]
En langage C#, un tableau dentiers une seule dimension de 7 cases se dclare comme ceci :
//C# int[] monTableau = new int[7];
On remarque que cette syntaxe ressemble la syntaxe dinitialisation de variable quelconque, la seule diffrence tant les crochets devant int indiquant que cest un tableau.
3.1.2
Parcourir un tableau une dimension On peut parcourir un tableau une dimension grce une boucle for. Cette boucle va afficher la valeur de la case pour chaque rang du tableau. Il ne faut pas oublier quun tableau commence au rang 0. Notre indice i va donc tre initialis zro et va tre incrmente chaque tour jusquau rang maximum. Afin dtre adaptable toutes les tailles de tableaux, nous utilisons la mthode GetLenght(indice) qui renvoie la taille du tableau pour la dimension entre parenthse.
12
[Date : 14/09/09]
On peut galement parcourir un tableau grce une boucle foreach comme ceci :
//C# foreach (int a in monTableau) { Console.WriteLine(a); }
3.1.3
Dimension multiples Ici nous allons dclarer un tableau 2 dimensions. Pour cela il faut rajouter une virgule entre les crochets indiquant que cest un tableau 2 dimensions (2 virgules pour un tableau 3 dimensions, 3 virgules pour un tableau 4 dimension etc.). Les dimensions sont entre accolades et celles-ci sont spares entre elles par une virgule, le tout tant lui aussi compris entre accolades.
//C# int[,] monTableau = { { 11, 12, 22, 33, 34, 44,45 } , { 21, 22, 23, 24, 25, 26,27 } };
3.1.4
Parcourir un tableau dimensions multiples Ici nous allons appliquer la mme mthode que pour un tableau une seule dimension, sauf que nous allons imbriquer les boucles for afin de balayer toutes les dimensions, ici en loccurrence 2.
//C# int j; //indice de la dimension verticale. int i; //indice de la dimension horizontale for (j = 0; j < monTableau.GetLength(0); j++) { for (i = 0; i < monTableau.GetLength(1); i++) { Console.Write("j={0} i={1} : ",j, i); Console.WriteLine(monTableau[j, i]); } }
Encore une fois nous pouvons faire la mme chose avec une boucle foreach assez simple en lui disant dafficher tout les lments prsents dans notre tableau : Dotnet France Association
13
[Date : 14/09/09]
3.2.2
Ajouter des lments la liste A prsent notre liste est cr, on va lui ajouter des valeurs, un vrai jeu denfant puisque les objets de type liste possde une mthode Add() qui nous permet dajouter des lments entre parenthses. Dans lexemple suivant, on va rajouter notre liste les dix premiers nombres de la suite de Fibonacci :
//C# static void Main(string[] args) { List<int> Fibonacci = new List<int>(); Fibonacci.Add(0); Fibonacci.Add(1); Fibonacci.Add(1); Fibonacci.Add(2); Fibonacci.Add(3); Fibonacci.Add(5); Fibonacci.Add(8); Fibonacci.Add(13); Fibonacci.Add(21); Fibonacci.Add(34); }
14
[Date : 14/09/09]
Parcourir la liste A prsent nous allons parcourir notre liste et faire afficher chaque lment. Nous allons voir deux mthodes, une traditionnelle utilisant la boucle for et une seconde utilisant une boucle foreach.
3.2.3.1 //C# //Boucle "for" traditionelle : int i; for (i = 0; i < Fibonacci.Count(); i++) { Console.WriteLine(Fibonacci[i]); }
3.2.3.2 //C#
Cette boucle signifie Pour chaque lment dans la liste Fibonacci afficher notre lment. Le mot element a t choisi ici par dfaut, mais vous pouvez le remplacer par nimporte quel mot de votre choix, a condition dutiliser le mme dans la partie de code de la boucle.
3.2.4
Action sur la liste Les objets de type List possdent de nombreuses mthodes qui nous permettent de modifier notre liste ou bien dobtenir des informations sur les donnes stockes dans celles ci. Nous allons prsenter ici quelques exemples de mthodes utiles :
//C# //Mthodes modifiant notre liste : Fibonacci.Clear();//Supprime toute les valeures Fibonacci.Insert(place,nb);//Insre notre nombre la place desire Fibonacci.Reverse();//Range la liste dans le sens inverse. //Mthode descriptives : Fibonacci.Count();//Count retourne le nombre d'elements Fibonacci.Max();//Renvoie la valeur maximum de la liste Fibonacci.Min();//Renvoie la valeur maximum de la liste Fibonacci.Sum();//Renvoie la somme des lments Fibonacci.BinarySearch(nombre);//Renvoie l'indice de l'objet a trouver Fibonacci.Contains(nombre);//Renvoie vrai si le nobre est trouv
15
[Date : 14/09/09]
3.3.2
Utiliser une numration Ici nous allons poursuivre lexemple en utilisant lnumration prcdemment dclare. Dans notre main nous allons crer la variable jourDeStage qui sera du type Jours :
//C# class Program { enum Jours { lun, mar, mer, jeu, ven, sam, dim }; static void Main(string[] args) { Jours jourDeStage; //variable de type "Jours" jourDeStage = Jours.jeu; Console.WriteLine(jourDeStage); Console.ReadLine(); } }
Vous avez surement remarqu le fait que la dclaration de Jours se faisait hors de la mthode main. Ce dtail est trs important puisque la dclaration dune numration ne peut seffectuer lintrieur dune fonction. Grce notre numration, nous voyons ci-dessous que lIntelliSense de Visual Studio nous propose les diffrents choix possibles pour notre variable jourDeStage .
16
[Date : 14/09/09]
Autre remarque importante, les membres dune numration peuvent galement tre appels avec leur numro:
//C# class Program { enum Jours { lun, mar, mer, jeu, ven, sam, dim }; static void Main(string[] args) { Jours jourDeStage; jourDeStage = (Jours)0; Console.WriteLine(jourDeStage); Console.ReadLine(); } }
Ici, (Jours)0 quivaut lundi, (Jours)1 quivaut mardi etc. Dernire remarque concernant les numrations, on peut forcer lattribution dun numro un membre.
17
[Date : 14/09/09]
Dans lexemple suivant nous allons attribuer la valeur 1 lundi, au lieu de 0, sa valeur par dfaut :
//C# class Program { enum Jours { lun=1, mar, mer, jeu, ven, sam, dim }; static void Main(string[] args) { Jours jourDeStage; jourDeStage = (Jours)3; //quivaut donc mercredi. Console.WriteLine(jourDeStage); Console.ReadLine(); } }
3.4.1
Dclaration et initialisation Nous allons prendre lexemple dun coureur, un coureur a un nom, un prnom ainsi quun numro de dossard. Nous allons dons crer la structure Coureur qui va contenir ses champs. Nous dclarons la structure en dehors du main mais nous dclarons les diffrents champs en public afin que ceux-ci soient accessibles dans le main.
//C# struct Coureur { public string nom; public string prnom; public int Dossard; }
18
[Date : 14/09/09]
struct Coureur { public string nom; public string prnom; public int Dossard; } static void Main(string[] args) { //Dclaration dune variable de type coureur : Coureur lucas; //On remplit les champs : lucas.nom = "Dupont"; lucas.prnom = "Lucas"; lucas.Dossard = 3; Console.WriteLine("Nom : " + lucas.nom); Console.WriteLine("Prnom : " + lucas.prnom); Console.WriteLine("Dossard : " + lucas.Dossard); Console.ReadLine(); } }
Ici aussi, lIntelliSense de Visual studio nous proposera les diffrents champs de la structure lors le la saisie du point devant Lucas .
19
[Date : 14/09/09]
Nous allons expliquer un par un les termes ci-dessus : Le nom de la mthode : On va mettre ici le nom choisi pour notre mthode, nom qui nous servira par la suite appeler la fonction depuis le main. On choisit ci nimporte quel nom (de prfrence explicite) et on lcrira, par exemple, en PascalCase. Paramtres : La liste des paramtres est la liste des objets que notre mthode va prendre en entre. Entre les parenthses nous allons indiquer le nom de notre paramtre prcd de son type. Prenons lexemple dune mthode qui lve un nombre une puissance donnes. Cette mthode aura par exemple pour paramtre (int nombre, int puissance). Le type de retour : cest le type de la variable que lon veut renvoyer. Par exemple si on veut une mthode qui notre calcule le carr dun nombre quon lui envoie. Notre mthode se devra de retourner une variable de type int contenant le rsultat. Notre type de retour sera donc int . Le type de retour peut tre nimporte quel type tel que int long float string ou il peut tre void indiquant que la mthode ne renvoie aucune valeur. Attention une mthode void ne renvoie pas rien ! Elle renvoi quelque chose puisquelle renvoie void , ce qui signifie vide . Le retour : Lorsquon dfinit une mthode qui renvoie autre chose que void, linstruction return est essentielle au renvoi de la donne indique lors de la cration de la mthode. Si on cre une mthode qui renvoie un int , il y aura un return suivi dune variable de type int .
4.1.1
Exemple Nous allons crer une mthode qui calcule laire dun rectangle. Notre mthode doit prendre en paramtre une longueur et une largeur, et elle doit nous renvoyer laire en valeur entire. Dotnet France Association
20
[Date : 14/09/09]
//C# static int calculAire (int longueur, int largeur) { int aire = longueur * largeur; return aire; }
4.1.2
Passage de paramtres Comme vu ci-dessus, les paramtres de la mthode se trouvent entre parenthses, juste aprs le nom de celle-ci. Nous allons voir quil existe deux moyens de passer des paramtres une mthode : par valeur et par rfrence. Par valeur Lorsque lon passe des paramtres par valeur, la variable aura toujours sa valeur initiale, il est impossible de la changer la racine. C'est--dire que mme si on change cette valeur lintrieur dune mthode, on ne modifiera pas la valeur attribue lors de linitialisation du paramtre, mais seulement une copie de cette valeur.
4.1.2.1
Pour expliquer cette notion assez complexe nous allons nous servir dun exemple.
//C#
//Notre mthode static int notre_methode(int x) { x = 7; return x; } //La mthode principale "Main" static void Main() { int a = 2; Console.WriteLine("Avant le passage de la mthode a = " + a); Console.WriteLine("Au passage de la mthode\ta = " + notre_methode(a)); Console.WriteLine("Aprs le passage de la mthode a = " + a); Console.ReadLine(); }
21
[Date : 14/09/09]
La console nous renvoie laffichage suivant : Avant le passage de la mthode a = 2 Au passage de la mthode a=7 Aprs le passage de la mthode a = 2
Au dbut du programme, notre entier a est initialis 2 et on le fait afficher par la console qui indique a=2 ce qui est tout fait normal. Puis on fait afficher le retour de notre mthode, celle-ci pris une copie de a et a remplac sa valeur par 7, la deuxime ligne est donc logique. Apres le passage de la mthode, on voit que la valeur de a dans le main na pas t modifi. Par rfrence Contrairement au type valeur, les paramtres passs en rfrence sont passs grce leur adresse mmoire ce qui permet aux mthodes de modifier directement la valeur la source. Pour passer un paramtre pas rfrence, il suffit dajouter le mot cl ref devant le paramtre, dans la fonction et dans lappel.
4.1.2.2
Nous allons reprendre exactement lexemple prcdent, mais cette fois ci avec un passage par rfrence pour permettre notre mthode de modifier la valeur de a .
//C#
//Notre mthode static int notre_methode(ref int x) { x = 7; return x; } //La mthode principale "Main" static void Main() { int a = 2; Console.WriteLine("Avant le passage de la mthode a = " + a); Console.WriteLine("Au passage de la mthode\ta = " + notre_methode(ref a)); Console.WriteLine("Aprs le passage de la mthode a = " + a); Console.ReadLine(); }
A prsent, lorsquon excute on obtient ceci : Avant le passage de la mthode a = 2 Au passage de la mthode a=7 Aprs le passage de la mthode a = 7
22
[Date : 14/09/09]
Utilisation des mthodes Comme on a pu le voir dans lexemple prcdent, les mthodes sont vraiment utiles, elles nous permettent un important gain de temps et surtout elles sont dune grande efficacit. Dune part le fait quon puisse mettre du code part lintrieur de mthodes et de pouvoir le rutiliser nimporte quel moment n importe o dans le programme nous permet aussi une meilleure gestion du programme.
Dans ce programme aucune exception na t tablie. Cela veut donc dire que aucune erreur nest prise en charge. Si lutilisateur entre un nombre entier, le programme ne pose aucun problme et tout se passe comme prvu : Quel ge avez-vous ? 20 Vous avez donc 20 ans
Cependant si lutilisateur entre une chaine de caractres, quelque chose dinattendu se produit. Quel ge avez vous ? Vingt Le programme sarrte ici et Visual Studio nous affiche un message derreur :
23
[Date : 14/09/09]
On nous dit que "Lexception FormatException na pas t gre", ce qui nous indique quil ny a aucun contrle sur lentre effectue par lutilisateur. Afin de grer cette exception, nous allons utiliser les mots cls try et catch qui formeront deux bloc indispensables. Nous allons maintenant voir de plus prs ces mots cls, quoi servent-ils et comment les utiliser. 4.2.2 try Le mot try veut dire essayer , et cest dans ce bloc try que nous allons placer notre code risque. Le code plac dans ce bloc va sexcuter tant quaucune erreur ne vient perturber le droulement du programme.
//C# static void Main(string[] args) { int age = 0; Console.WriteLine("Quel ge avez-vous?"); try { age = int.Parse(Console.ReadLine()); Console.WriteLine("Vous avez donc " + age + " ans"); } Console.ReadLine(); }
24
[Date : 14/09/09]
En effet il attend de nous un mot cl catch ou finally . Nous allons maintenant voir le mot cl catch. 4.2.3 catch Nous avons vu try et nous savons quil sert essayer du code. Si ce code ne marche pas, par exemple cause dune mauvaise entr de la part de linterlocuteur, que se passe-t- il? Cest ici quentre en jeu le mot cl catch. Si il y a une erreur, comme dans notre tout premier exemple, au lieu de faire planter le programme le catch va permettre de faire faire au programme une action, par exemple un message derreur, qui va indiquer linterlocuteur la nature de son erreur. Le catch suit obligatoirement un try . Plaons maintenant un message derreur si linterlocuteur nentre pas un nombre entier :
//C# static void Main(string[] args) { int age = 0; Console.WriteLine("Quel ge avez-vous?"); //code risque try { age = int.Parse(Console.ReadLine()); Console.WriteLine("Vous avez donc " + age + " ans"); } //Le code plac ici s'execute si une exception est leve catch { Console.WriteLine("Dsol vous devez crire un nombre!"); } Console.ReadLine(); }
Si on essaie prsent dcrire une chaine de caractre voici le message qui sera renvoy : Quel ge avez-vous ? Vingt Dsol vous devez crire un nombre ! Et bien sur le programme ne plante pas. Nous venons de faire une gestion dexception. Bien que tout cela marche, il reste un mot cl voir : finally. Dotnet France Association
25
[Date : 14/09/09]
Finally Le bloc finally contient du code qui sera toujours excut, quil y est une exception leve ou non. Ce bloc est facultatif, il sutilise comme ceci :
//C# static void Main(string[] args) { int age = 0; Console.WriteLine("Quel ge avez-vous?"); //code risque try { age = int.Parse(Console.ReadLine()); Console.WriteLine("Vous avez donc " + age + " ans"); } //Le code plac ici s'execute si une exception est leve catch { Console.WriteLine("Dsol vous devez crire un nombre!"); } finally { Console.WriteLine("\n*** Merci de votre visite ***"); } Console.ReadLine(); }
Maintenant si non essayons les deux cas de figure, le finally sera toujours excut. Sans exception : Quel ge avez-vous ? 20 Vous avez donc 20 ans *** Merci de votre visite *** Avec exception : Quel ge avez-vous ? Vingt Dsol vous devez crire un nombre ! *** Merci de votre visite ***
26
[Date : 14/09/09]
Exception multiples Dans le programme prcdant, le mme bloc catch attrapait toutes les exceptions. Donc notre programme renvoyait le mme message derreur quel que soit la nature de lerreur. Il existe un moyen en C# de faire des exceptions multiples, pour cela il suffit de placer plusieurs blocs catch en leur associant lexception approprie :
//C# static void Main(string[] args) { try { } catch (Exception) { } catch (Exception) { } }
On peut bien entendu mettre autant de catch que lon souhaite. Une diffrence avec les exceptions multiples cest que logiquement chaque catch a maintenant une fonction. Cette fonction va tre dfinie entre parenthses juste aprs sa dclaration (ici dans lexemple Exception). Visual Studio nous aidera bien trouver lexception que nous cherchons en nous proposant la totalit des exception dj prdfinies :
27
[Date : 14/09/09]
Maintenant quon a vu son fonctionnement, on va faire un exemple comprenant trois catch grant trois exceptions. Nous allons prendre pour exemple une division, avec trois restrictions : que les nombres soient positifs, pas de divisions par zro et pas de chaine de caractres. A chaque bloc catch, nous associerons lexception associe comme ceci :
//C# static void Main(string[] args) { Console.WriteLine("Nous allons faire une division avec des nombres positifs :"); Console.Write("\nEntrez un premier nombre : "); try { uint a = uint.Parse(Console.ReadLine()); Console.Write("Entrez un deuxieme nombre : "); uint b = uint.Parse(Console.ReadLine()); uint c = a / b; Console.WriteLine("Le rsultat de la division est " + c); } catch (OverflowException) //type uint ne peut tre ngatif { Console.WriteLine("Entrez un nombre positif s'il vous plait"); } catch (DivideByZeroException) //on ne peut diviser par zro { Console.WriteLine("Dsol vous ne pouvez pas diviser par zero"); } catch (FormatException) //chaine de caractres non autorises car uint { Console.WriteLine("Les chaine de caractres ne sont pas autorises"); } finally { Console.WriteLine("\n*** Au revoir! ***"); } Console.ReadLine(); }
28
[Date : 14/09/09]
5 Conclusion
Ce chapitre complte le chapitre prcdant concernant les notions fondamentales du langage C#. Nous avons abord des concepts avancs en passant en revue les notions savoir tel que le type var , les types valeur, type rfrence les conversions de donnes. Nous avons vu diffrentes structures de donnes telles que les tableaux, les listes, les structures et les numrations. Nous avons termin ce chapitre en introduisant la notion de mthode puis nous nous sommes intresss la gestion des exceptions. Le prochain chapitre sera un chapitre entirement ddi aux diffrents concepts de la programmation objet.