Professional Documents
Culture Documents
PDF gnrs en utilisant latelier en source ouvert mwlib . Voir http://code.pediapress.com/ pour plus dinformations. PDF generated at: Sun, 02 Oct 2011 06:07:50 UTC
Contenus
Articles
Programmation C sharp Programmation C sharp/Introduction Programmation C sharp/Compilation Programmation C sharp/Un premier programme 1 2 3 6 9 9 10 15 18 20 23 24 28 33 35 41 48 53 55 59 62 65 65 66 69 73 76 85 89 92 93
Le langage
Programmation C sharp/Les commentaires Programmation C sharp/Les espaces de noms Programmation C sharp/Les variables et les constantes Programmation C sharp/Les types de base et les dclarations Programmation C sharp/Les tableaux Programmation C sharp/Les objets Programmation C sharp/Les classes Programmation C sharp/Les fonctions Programmation C sharp/Proprits et indexeurs Programmation C sharp/Les oprateurs Programmation C sharp/Structures de contrle Programmation C sharp/Hritage de classes Programmation C sharp/Classe abstraite Programmation C sharp/Les exceptions Programmation C sharp/Structures et numrations Programmation C sharp/Interfaces
Programmation avance
Programmation C sharp/Type partiel Programmation C sharp/Surcharge des oprateurs Programmation C sharp/Directives du prprocesseur Programmation C sharp/Documentation XML des classes Programmation C sharp/Attributs Programmation C sharp/Delegates et events Programmation C sharp/Types gnriques Programmation C sharp/Appel de plateforme Programmation C sharp/Code non vrifi
API .Net
Programmation C sharp/Interfaces graphiques Programmation C sharp/Interfaces graphiques/Graphique vectoriel Programmation C sharp/Fonctions asynchrones Programmation C sharp/Threads et synchronisation Programmation C sharp/Processus Programmation C sharp/Entres-sorties Programmation C sharp/La srialisation Programmation C sharp/Les fichiers Programmation C sharp/Programmation rseau Programmation C sharp/Excution distante
96 96 99 102 103 115 116 119 123 127 128 132 132 133
Ressources
Programmation C sharp/Bibliographie et liens Programmation C sharp/Index des mots-cls du langage
Rfrences
Sources et contributeurs de larticle Source des images, licences et contributeurs 143 144
Programmation C sharp
Programmation C sharp
Programmation C# Un livre appartenant la srie Programmation et l'tagre Informatique de Wikilivres.
Ce livre prsente le langage C#. Il est destin ceux qui souhaitent utiliser ce langage de programmation orient objet, que le lecteur soit un programmeur dbutant ou confirm. Pour s'adresser un large public, tudiant ou professionnel, cet ouvrage est divis en plusieurs parties. Dans les premires parties prsentant les bases, il est conseill de suivre l'ordre des chapitres. La premire partie prsente le langage et les outils pour l'utiliser. Introduction Compilation Un premier programme
Le langage
Cette partie prsente la syntaxe de base du langage C#. Les commentaires Les espaces de noms Les variables et les constantes Les types de base et les dclarations Les tableaux Les objets Les classes Les fonctions Proprits et indexeurs Les oprateurs Les structures de contrle Hritage de classes Classe abstraite Les exceptions Structures et numrations Interfaces
Programmation avance
Cette section s'adresse aux programmeurs avancs voulant exploiter les fonctionnalits les plus avances du langage. Type partiel Surcharge des oprateurs Directives du prprocesseur Documentation XML des classes Attributs Delegates et events Types gnriques Appel de plateforme Code non vrifi
Programmation C sharp
API .Net
Cette partie prsente les classes de l'API pour utiliser les fonctions du systme d'exploitation. Interfaces graphiques Graphique vectoriel Fonctions asynchrones Threads et synchronisation Processus Entres-sorties La srialisation Les fichiers Programmation rseau Excution distante
Ressources
Cette section prsente une liste de ressources utiles pour en apprendre davantage sur le langage C#. Bibliographie et liens Index des mots-cls du langage Livre d'or
Programmation C sharp/Introduction
Le langage de programmation C# (C dise en franais, ou prononc C-sharp en anglais) a t dvelopp par la socit Microsoft, et notamment un de ses employs, Anders Hejlsberg, pour la plateforme .NET (point NET / dot NET). Ce langage est orient objet, avec un typage fort. Il est trs proche du langage Java. Il est prcompil en MSIL (Microsoft Intermediate Language), puis excut sur une machine virtuelle, ou compil en code natif l'excution. Il dispose d'un ramasse-miettes (garbage collector). Il utilise l'API .NET en remplacement des MFC (Microsoft foundation class). Il semble tre le nouveau langage pour dvelopper des applications Windows, avec Visual Basic et C++.
C sharp
Caractristiques partages
Le langage C# possde un certain nombre de caractristiques communes avec d'autres langages de programmation. Il sera donc plus facile de l'apprendre si ces autres langages sont connus.
Programmation C sharp/Introduction commenant par le caractre arobase @ ; tandis que le langage C# utilise les commentaires /// au format XML ; Mthodes courantes : une majeure partie des mthodes de l'API de C# ressemblent celles de Java, except que leur nom commence par une majuscule : Main, Equals, ToString, Length, IndexOf, ...
Programmation C sharp/Compilation
Les fichiers sources
Un fichier source C# porte l'extension ".cs". Il s'agit d'un fichier texte. Le programme compil porte l'extension ".exe". Une bibliothque rassemble des classes et porte l'extension ".dll". Elle peut tre utilise par un programme ou une autre bibliothque.
La compilation
Un compilateur C# permet la traduction du programme source en instructions .Net. Contrairement d'autres compilateurs, ces instructions sont produites pour un processeur virtuel et ne sont donc pas directement interprtes par le processeur, mais interprts par le moteur .Net. Sous Windows, le compilateur produit un excutable appelant l'interprteur .Net. Sous Linux, le programme produit n'est pas directement excutable et doit tre lanc en argument de l'interprteur mono.
Programmation C sharp/Compilation
Compilateurs
Plusieurs compilateurs C# existent selon la plateforme utilise. Il existe plusieurs versions des spcifications du framework : 1.0, 1.1, 2.0. Ces versions successives ajoutent de nouvelles fonctionnalits au langage. Il existe galement diffrentes versions de la spcification du langage C# : C#1.0 : version initiale du langage, C#2.0 (version actuelle) : ajoute de nouvelles classes l'API (compression de donnes, collections gnriques, ...), permet l'utilisation de types gnriques, facilite la cration d'numration avec le mot cl yield, C#3.0 (future version) : ajoute de nouvelles facilits de syntaxe : types non spcifis pour les variables locales (dduit d'aprs la valeur d'initialisation), intgration des requtes SQL dans le langage (LINQ [1] ), ajout de nouvelles mthodes une classe existante, expressions lambda pour les delegates anonymes, initialisation des membres d'un objet la dclaration.
Rfrences
[1] [2] [3] [4] http:/ / msdn. microsoft. com/ data/ ref/ linq/ http:/ / msdn. microsoft. com/ vstudio/ express/ visualcsharp http:/ / www. icsharpcode. net/ OpenSource/ SD/ http:/ / www. mono-project. com
Compilation et excution
La compilation et l'excution peuvent se faire l'aide d'un environnement graphique. Il est toutefois utile de connatre la ligne de commande utiliser en cas d'absence d'environnement graphique ou si une option spciale de compilation doit tre utilise, ... Pour utiliser les lignes de commandes de compilation : 1. Ouvrir une fentre console, 2. Faire du rpertoire du programme compiler ou excuter le rpertoire courant, 3. Vrifier que la variable d'environnement PATH contient le chemin vers le compilateur, en tapant le nom du compilateur (csc sous Windows, gmcs sous Linux (Mono)). Si le compilateur ne se lance pas (programme non trouv) : Vrifier qu'un compilateur C# est install,
Programmation C sharp/Compilation Vrifier que le chemin complet du rpertoire du compilateur est contenu dans la variable d'environnement PATH, Essayer de lancer le compilateur en donnant son chemin complet. Le compilateur peut produire soit directement un excutable, soit un module (une bibliothque DLL) utilisable par d'autres programmes. Si les sources d'un excutable ou d'un module sont rpartis entre diffrents fichiers (mme rpertoire ou non), il faut spcifier leur chemin au compilateur. Exemple : Les sources de l'excutable prog.cs sont rpartis dans deux fichiers : C:\Prog\Exemple\main.cs et D:\Prog\Util\util.cs. Il faut donc utiliser la ligne de commande suivante :
Windows csc C:\Prog\Exemple\main.cs D:\Prog\Util\util.cs
Il est galement possible d'utiliser les caractres gnriques * et ? pour spcifier plusieurs fichiers. Les syntaxes des commandes utiliser pour les diffrentes tches du dveloppement sont rsumes dans le tableau suivant :
Tche compiler un programme (.exe) avec fentre console compiler un programme (.exe) sans fentre console Windows csc fichier.cs Linux gmcs fichier.cs
compiler une bibliothque (.dll) csc /t:library fichier.cs gmcs -target:library fichier.cs utiliser une bibliothque (.dll) excuter un programme csc /r:fichier.dll ... programme arguments... gmcs -r:fichier.dll ... mono programme.exe arguments...
Le fichier source
Enregistrez le listing suivant dans un document texte, intitul par exemple helloworld.cs : using System; public class HelloWorld { public static void Main() { Console.WriteLine("Hello world !"); Console.ReadLine(); } }
Test
Compilez-le, puis lancer l'excutable produit. Le programme doit afficher : Hello world !
Dtails
Voici le dtail ligne par ligne du fichier source, certains concepts tant expliqus dans les chapitres suivants : using System; Le fichier source utilise l'espace de noms nomm "System". public class HelloWorld { Dclaration d'une classe nomme "HelloWorld". public static void Main() { Dclaration d'une mthode statique nomme "Main" dans la classe HelloWorld. Cette mthode est celle qui est appele au dmarrage du programme. Console.WriteLine("Hello world !"); Affichage de la ligne "Hello world !" sur la console. Console dsignant la console, appartient l'espace de nom System. Console.ReadLine();
Programmation C sharp/Un premier programme Attendre que la touche entre soit frappe avant de poursuivre. Cette ligne de code n'est pas ncessaire si vous lancez le programme depuis une console dj ouverte. Dans le cas contraire (double-clic sous Windows), cette ligne de code permet de maintenir la fentre de console ouverte, car celle-ci se ferme une fois le programme termin (option par dfaut). }
Test
Compilez la bibliothque :
Windows csc /t:library helloworld.cs
Le compilateur a cr un fichier nomm helloworld.dll. Cette bibliothque doit tre utilise lors de la compilation du programme principal. Compilez le programme :
Windows csc /r:helloworld.dll premierprog.cs
Le langage
Programmation C sharp/Les commentaires
Tout bon programme a des fichiers sources bien comments pour expliquer comment cela fonctionne et pourquoi certains choix ont t faits. Ce qui vite une perte de temps lorsque le code source est repris et modifi, soit par un autre dveloppeur, soit par l'auteur qui ne se souvient pas forcment de son projet s'il n'y a pas touch depuis longtemps.
Bloc de commentaire
Un bloc de commentaire est dlimit par les signes slash-toile /* et toile-slash */ comme en Java et en C++. Exemple : /* Un commentaire explicatif sur plusieurs lignes... */ Les blocs ne peuvent tre imbriqus car ds que le compilateur trouve slash-toile /*, il recherche la premire occurrence d'toile-slash */ terminant le commentaire. /* : dbut du commentaire /* : ignor fin du commentaire : */ erreur ici car le commentaire est fini : */
Astuce : Visual Studio utilise ce type de commentaire pour les commandes commenter/dcommenter le groupe de lignes slectionnes (raccourcis claviers : [Ctrl-E] [C] pour commenter, [Ctrl-E] [U] pour dcommenter, ou [Ctrl-K] [C] et [Ctrl-K] [U] avec les versions de Visual Studio .NET antrieures 2005).
10
Commentaire de documentation
Le langage C# utilise une forme spciale des commentaires pour documenter les classes. Ces commentaires commencent par un triple slash /// et se terminent au prochain retour la ligne. Alternativement, ils peuvent tre encadrs par /** et */. Le contenu de ces commentaires est au format XML. Il est possible d'utiliser plusieurs lignes. Cette documentation se rapporte toujours un des lments de la dclaration qui suit. Exemple : /// <summary> /// Une classe pour dmontrer /// les commentaires de documentation /// </summary> public class Exemple { ... } Certaines balises XML sont standards, mais il est possible d'utiliser des balises supplmentaires. Pour plus de dtails, voir le chapitre nomm Documentation XML des classes.
11
MesClasses.Calcul
12
Programmation C sharp/Les espaces de noms Si l'instruction using est utilise deux fois, le nom Ligne est ambigu, comme l'explique l'erreur produite par le compilateur : using Gestion.Transport; using Graphique.Dessin; public class Exemple { Ligne exemple; // -> error CS0104: 'Ligne' is an ambiguous reference between // 'Gestion.Transport.Ligne' and 'Graphique.Dessin.Ligne'. } Dans ce cas, on peut utiliser l'instruction using pour l'un des deux espaces de nom et utiliser le nom complet pour l'autre espace de nom : using Gestion.Transport; public class Exemple { Ligne transport; Graphique.Dessin.Ligne trace; } Il est galement possible de dfinir deux alias d'espace de nom afin d'abrger les rfrences: using transport=Gestion.Transport; using dessin=Graphique.Dessin; public class Exemple { transport::Ligne transport; dessin::Ligne trace; }
13
Conflit de nom
Il est possible que le code source utilise des noms dj utilis comme espace de noms. Dans l'exemple de code suivant, les noms System et Console font rfrence des attributs de la classe Classe. public class Classe { private string System = "system"; private string Console = "console"; public void Afficher() { // System.Console.WriteLine("Exemple"); // provoque une erreur } }
Programmation C sharp/Les espaces de noms Il est toutefois possible d'utiliser System.Console en utilisant le prfixe global:: qui permet de spcifier que l'on accde l'espace de nom racine de tous les autres (implicite par dfaut) : public class Classe { private string System = "system"; private string Console = "console"; public void Afficher() { global::System.Console.WriteLine("Exemple"); // OK } }
14
Alias d'assemblages
Lorsqu'une application utilise des assemblages dont les noms de classes complets (espace de nom inclus) sont identiques (deux versions/implmentations d'une mme classe), l'ambigut doit tre rsolue en utilisant des alias d'assemblages. Pour utiliser deux versions d'une mme classe dfinies dans les assemblages grid.dll (version 1.0, alias "GridV1") et grid20.dll (version 2.0, alias "GridV2"), il faut dfinir les alias utiliser dans la ligne de commande de compilation :
Windows csc /r:GridV1=grid.dll /r:GridV2=grid20.dll ...
Cela cre les alias externes GridV1 et GridV2. Pour utiliser ces alias partir d'un programme, il faut les rfrencer l'aide du mot cl extern : extern alias GridV1; extern alias GridV2; Ces deux instructions crent deux nouvelles racines d'espace de nom en plus de global : extern alias GridV1; extern alias GridV2; public class Exemple { GridV1::Grid grid_v1; // implmentation V1.0 (grid.dll) GridV2::Grid grid_v2; // implmentation V2.0 (grid20.dll) }
15
Dclaration
Une variable possde un nom et un type. Ce type dtermine ce que peut stocker la variable : un nombre, une chane de caractre, un objet d'une classe particulire ... La syntaxe est la suivante : type nom [ = expression ] ; Exemples : double prix_unitaire; int quantite = 50; string article = "Pommes"; bool rabais = false; Assigner une variable (initialiser) la dclaration n'est pas obligatoire. Dans ce cas, elle possde la valeur par dfaut correspondant au type : la valeur par dfaut des types numriques et caractres (char) est zro (0), la valeur par dfaut du type boolen (bool) est false, la valeur par dfaut des types rfrences (objet, chane de caractre, tableaux) est null, la valeur par dfaut des types numrs (enum) est celle qui correspond au type sous-jacent (int par dfaut).
Il est possible de regrouper la dclaration de plusieurs variables du mme type en utilisant une virgule pour sparer les diffrentes variables. Exemple : int quantite = 50, nombre, quantite_en_stock = 100 ; Ou en plaant une variable par ligne pour plus de clart : int quantite = 50, nombre, quantite_en_stock = 100 ;
16
Utilisation
Une variable est utilise pour stocker des rsultats intermdiaires, des donnes qui serviront ultrieurement. La valeur d'une variable peut tre modifie autant de fois que ncessaire. Exemple : prix_unitaire = 1.50; if (rabais) prix_unitaire = prix_unitaire - 0.20; double prix_total = prix_unitaire * quantite ;
Programmation C sharp/Les variables et les constantes System.Console.WriteLine("Nombre = " + nombre); // la variable membre // Nombre = 5 } }
17
Les constantes
Une constante nomme est associe une valeur pour toute la dure de l'application. Sa valeur ne peut changer.
Dclaration
La syntaxe est similaire celle de la dclaration d'une variable, except que le mot cl const prcde la dclaration, et que l'initialisation la dclaration est obligatoire : const type nom = expression ; Exemple : const double prix_unitaire_unique = 1.50 ; const double taux_euro_en_francs = 6.55957 ; Comme les variables il est galement possible de regrouper la dclaration de plusieurs constantes du mme type : const double prix_unitaire_unique = 1.50 , taux_euro_en_francs = 6.55957 ;
Programmation C sharp/Les variables et les constantes N.B.: Une constante est implicitement statique. Il est donc inutile d'ajouter le mot-cl static, sinon le compilateur gnre une erreur.
18
decimal System.Decimal Nombre virgule flottante sur 128 bits string System.String Chane de caractres
19
Auto-boxing/unboxing
Chaque type de donnes correspond une classe de l'espace de nom System. La conversion entre le type et une instance de cette classe est implicite et invisible. Ainsi, on peut appeler des mthodes sur les types simples, affecter une constante o une classe de type est attendue (et vice versa), ... Exemple : int a = 25; string message = 36.ToString(); // convertit 36 en chane de caractres, // mthode dfinie dans la classe System.Int32 UInt32 b = 50;
Types nullable
Le langage C#2.0 introduit la possibilit pour les types simples de valoir null. Cette fonctionnalit permet une meilleure interoprabilit avec les bases de donnes qui utilisent ce type de donnes. Pour qu'une variable puisse valoir null (nullable), il faut que le type soit suivi d'un point d'interrogation. Par exemple : int? numero = null; Il est donc possible de tester qu'une variable de ce type vaut null : if (numero==null) numero = 50; else numero++; Le nouvel oprateur ?? (double point d'interrogation) permet de slectionner l'oprande de gauche s'il ne vaut pas null, ou l'oprande de droite sinon : valeur_ou_null??valeur_si_null Cet oprateur est donc pratique utiliser avec les types nullables pour obtenir une valeur par dfaut :
Programmation C sharp/Les types de base et les dclarations Console.WriteLine("Numro : "+( numero??50 ));
20
Obtenir le type
L'oprateur typeof retourne une instance de la classe System.Type pour le type spcifi entre parenthses. Exemple: Type t=typeof(int); L'utilit de cet oprateur est plus vident avec l'utilisation de types gnriques.
21
Pr-initialisation
Il est galement possible de dfinir directement les valeurs que le tableau contient. Ces valeurs doivent tre comprises entre des accolades et spares par une virgule. Le compilateur dtermine le nombre d'lments allouer d'aprs la liste d'lments spcifie la suite de l'instruction d'allocation. Exemples : A la dclaration du tableau : int[] entiers = new int[] { 10,15,20,25,30,35,40,45 }; Hors dclaration : entiers = new int[] { 10,15,20,25,30,35,40,45 }; Seule la dclaration peut omettre l'instruction d'allocation du tableau avant les accolades : int[] entiers = { 10,15,20,25,30,35,40,45 }; Dans ce cas, le compilateur alloue implicitement un tableau du mme type que la variable dclare, pour le nombre d'lments placs entre les accolades.
Programmation C sharp/Les tableaux for(int i=0 ; i<2 ; i++) Console.WriteLine("entier n" + i + " = " + entiers[ i ] );
22
Tableaux multi-dimensionnels
Les tableaux vus jusqu' prsent taient des tableaux uni-dimensionnels : ils n'ont qu'une seule dimension, c'est dire un seul index. Certaines applications ncessitent des tableaux deux indices ou davantage. Par exemple, une image est reprsente par un tableau de couleurs index par l'abscisse (x) et l'ordonne (y). Un tableau multi-dimensionnel utilise la mme syntaxe, en sparant les indices par une virgule. int[,] image = new int[ 32, 16 ]; // un tableau de 32*16 entiers, soit 512 entiers image[1,5] = 0; Un tableau de tableaux (appel jagged array ou tableau dchiquet) utilise la syntaxe des tableaux uni-dimensionnels en utilisant un tableau comme type de base : int[][] ensembles = new int[10][]; // un tableau de 10 tableaux d'entiers ensembles[0] = new int[11]; // dont le premier contient 11 entiers ensembles[1] = new int[] { 2, 3 }; // le deuxime : 2 entiers (2 et 3) // ensembles[2] ensembles[9] valent null car non allous ensembles[1][1] = 4; // remplace la valeur 3 par 4 Chacun des sous-tableaux doit tre allou sparemment, et rien n'oblige ce qu'ils aient tous la mme dimension (d'o l'appellation de tableau dchiquet). Il est galement possible de combiner les possibilits : int[,][] donnees = new int[10,20][]; donnees[1,5] = new int[25]; donnees[1,5][10] = 12;
23
Le type object
La classe System.Object est quivalente au type object. Il s'agit de la classe de base de toutes les autres classes. L'auto-boxing/unboxing permet d'utiliser le type object pour n'importe quel type de valeur : object obj; obj = 10; // int -> Int32 -> object obj = "Une chane"; // string -> String -> object
24
Programmation C sharp/Les classes } Console.WriteLine("N suivant = " + UnExemple.numero_suivant ); Console.WriteLine("N = " + UnExemple.numero ); // Erreur de compilation, car la variable n'est pas dfinie pour la classe UnExemple InstanceDUnExemple = new UnExemple(); Console.WriteLine("N = " + InstanceDUnExemple.numero );
25
Classe statique
Une classe statique ne contient que des membres statiques, et ne peut tre instancie. Le mot cl static prcde la dclaration de cette classe. Exemple : public static class UneClasseStatique { public static void Afficher(string message) { // ... } } UneClasseStatique.Afficher("Un exemple de message");
La rfrence nulle
Toute variable de type objet est en fait une rfrence initialise null par dfaut. Cette rfrence peut tre utilise quel que soit le type d'objet. Il est souvent ncessaire de tester si la rfrence est nulle avant d'accder un membre de l'objet rfrenc. Si le test n'est pas fait et que la rfrence est nulle, une exception est leve.
Niveaux de protection
Le niveau de protection est spcifi par un mot cl plac avant la dclaration d'une classe ou d'un membre de classe (attribut, mthode, proprit, ...) : public
Programmation C sharp/Les classes Accs autoris tous ; private Accs depuis la classe seulement ; protected Accs depuis la classe et ses sous-classes seulement ; internal Accs depuis l'assembly seulement. Exemple : public class Fraction { private int numerateur, denominateur; public void multiplier(Fraction autre) { } } En gnral, les rgles de l'encapsulation sont les suivantes : Toute mthode est publique, moins qu'elle ne soit destine tre exclusivement appele dans la classe, auquel cas est peut tre prive ou protge, Les attributs sont privs. Si un accs est ncessaire, il faut ajouter des mthodes d'accs (accesseurs), voire une proprit.
26
Constructeur
Un constructeur est une mthode spciale portant le nom de la classe, ne retournant aucune valeur, charge d'initialiser l'instance. Un constructeur peut avoir des paramtres permettant de dfinir les valeurs initiales des attributs du nouvel objet. Une classe possde souvent plusieurs constructeurs. Chacun possdant une liste d'arguments diffrente.
Exemple
Pour initialiser une fraction : public class Fraction { private int numerateur, denominateur; // Constructeur public Fraction(int numerateur, int denominateur) { // this est utilis pour dsigner les attributs de l'objet // plutt que les paramtres // recopie des paramtres :
Programmation C sharp/Les classes this.numerateur = numerateur; this.denominateur = denominateur; } public void multiplier(Fraction autre) { } } Utilisation : Fraction estimation_pi = new Fraction( 355 , 113 );
27
Constructeur statique
Il est possible d'excuter un code lors de la premire utilisation de la classe, cette initialisation peut tre vue comme un constructeur statique public class Fraction{ private static int valeur; static Fraction(){ valeur = 1; } }
28
29
5 100 30 100
30
Paramtre out
Un paramtre out ne sert la fonction qu' retourner une valeur. L'argument transmis doit rfrencer une variable ou un lment de tableau. Ce paramtre est prcd du mot-cl out la fois lors de sa dclaration, et lors de l'appel la mthode. La variable rfrence n'a pas besoin d'tre initialise auparavant. La fonction doit obligatoirement affecter une valeur la variable rfrence. Exemple : private void methodeTest(out int resultat) { //Console.WriteLine("fonctionTest : le nombre vaut " + resultat); resultat = 100; //Console.WriteLine("fonctionTest : le nombre vaut " + resultat); } private void testAppel() { int n; methodeTest(out n); // Appel la mthode Console.WriteLine("testAppel : le nombre vaut " + n); // On ne peut pas passer une expression ou une constante //methodeTest( 25 + 5 ); // <- erreur de compilation } Ce programme affiche : testAppel : le nombre vaut 100
Paramtre ref
Un paramtre ref est une combinaison des deux types de paramtres prcdents. L'argument transmis doit rfrencer une variable ou un lment de tableau qui doit tre initialis auparavant. Ce paramtre est prcd du mot-cl ref la fois lors de sa dclaration, et lors de l'appel la mthode. La mthode n'est pas oblige de modifier la valeur contenue dans la variable rfrence. Exemple : private void methodeTest(ref int resultat) { Console.WriteLine("fonctionTest : le nombre vaut " + resultat); resultat = 100; Console.WriteLine("fonctionTest : le nombre vaut " + resultat); } private void testAppel() { int n = 5; Console.WriteLine("testAppel : le nombre vaut " + n);
31
methodeTest(ref n); // Appel la mthode Console.WriteLine("testAppel : le nombre vaut " + n); // On ne peut pas passer une expression ou une constante //methodeTest( 25 + 5 ); // <- erreur de compilation } Ce programme affiche : testAppel : le fonctionTest : fonctionTest : testAppel : le nombre vaut 5 le nombre vaut 5 le nombre vaut 100 nombre vaut 100
C# 4.0 Mthode COM : ref optionnel L'appel une mthode d'interface COM utilisant un paramtre ref peut ne pas utiliser explicitement de variable. Exemple : La mthode COM suivante : void Increment(ref int x); Peut tre appele sans le mot cl ref : Increment(0); Ce qui est quivalent : int x = 0; Increment(ref x); Un paramtre ref est en gnral modifi par la mthode appele. Ne pas utilier le mot cl ref lors de l'appel signifie que la nouvelle valeur retourne par la mthode est ignore.
Programmation C sharp/Les fonctions public double Moyenne(params double[] nombres) { double sum=0; if (nombres.Length==0) return 0; foreach(double d in nombres) sum += d; return sum / nombres.Length; } Pour le paramtre marqu params, il est possible de transmettre soit une liste d'argument, soit un tableau contenant ces arguments. Exemples d'appels : double a = Moyenne(3.0, 2.0, 5.14, 8.22, 6.37); // Equivaut : double b = Moyenne( new double[]{ 3.0, 2.0, 5.14, 8.22, 6.37 } );
32
Surcharge de mthode
Une mthode peut tre surcharge (overload en anglais), c'est dire qu'il peut exister au sein de la mme classe plusieurs mthodes portant le mme nom, condition qu'elles soient diffrenciables par leur signature. La signature d'une mthode correspond aux types et nombre de paramtres accepts par celle-ci. Exemple : public int Ajouter ( int valeur1, int valeur2 ) { return valeur1 + valeur2; } public double Ajouter ( double valeur1, double valeur2 ) { return valeur1 + valeur2; } Le compilateur dtermine la mthode appeler en fonction du type des arguments passs la mthode. Exemple : Console.WriteLine("(entiers) 2 + 5 = " + Ajouter( 2, 5 )); Console.WriteLine("(rels) 2.0 + 5.0 = " + Ajouter( 2.0, 5.0 )); Le type de retour ne fait pas partie de la signature, car la valeur retourne par une mthode appele peut tre ignore. Si deux mthodes portent le mme nom et ont la mme signature, le compilateur gnre une erreur. Exemple : Les deux mthodes ont la mme signature. public double Longueur ( string chaine ) { return (double) chaine.Length;
Programmation C sharp/Les fonctions } public int Longueur ( string chaine ) { return (int) chaine.Length; }
33
Syntaxe
Type Nom_de_la_proprit { get // proprit lue { code retournant une valeur du Type spcifi } set // proprit modifie { code utilisant le paramtre prdfini "value" } } Le code contenu dans chaque bloc est le mme que celui que l'on placerait pour implmenter les mthodes suivantes : Type getNom_de_la_proprit() { code retournant une valeur du Type spcifi } void setNom_de_la_proprit(Type value) // proprit modifie { code utilisant le paramtre prdfini "value" }
Exemple
private string _message; public string Message { get {
Programmation C sharp/Proprits et indexeurs return _message; } set { _message = value; } } Utilisation : Message = "Test de la proprit" ; // <- accesseur set Console.WriteLine( Message ); // <- accesseur get Message += " et message ajout"; // <- accesseurs get et set
34
Noms rservs
Depuis la version 2003 du compilateur, lorsqu'une proprit est cre, deux noms de mthodes sont rservs pour les deux accesseurs : type get_Nom_proprit() void set_Nom_proprit(type value) La classe ne peut donc avoir de mthodes portant l'une de ces deux signatures.
Les indexeurs
Un indexeur est une proprit spciale qui permet d'utiliser une instance de la classe comme un tableau, en utilisant les crochets.
Syntaxe
Type_lment this[ Type_index index ] { get // lment [index] lu { Code retournant une valeur du Type_lments spcifi dont l'index est dans le paramtre index } set // lment [index] modifi { Code utilisant le paramtre prdfini "value" pour le stocker l'index spcifi par le paramtre index } } Type_lment Type de chaque lment du tableau virtuel. Type_index Type de l'indice spcifi entre crochets. index Variable contenant la valeur de l'indice de l'lment lu ou modifi.
Programmation C sharp/Proprits et indexeurs L'index peut avoir un autre type que int. C'est le cas des tables de hashage de l'espace de nom System.Collections.
35
Exemple
public class TableauVirtuel { public string this[int index] { // lecture seule car pas d'accesseur set get { return "Elment"+index.ToString(); } } } ... TableauVirtuel tab=new TableauVirtuel(); Console.WriteLine("tab[15] = " + tab[15] ); // affiche Elment15
Cependant, la division sur deux nombres entiers produit un nombre entier. Le reste de cette division est donn par l'oprateur modulo : 13 % 3 (1, car 13 = 3*4 + 1) La division donnera un nombre virgule flottante si au moins l'un des deux oprandes est de ce type : 12.0 / 5 donnera 2.4.
36
L'oprateur et ne retourne que les bits 1 communs aux deux oprandes. Exemple : 0x93 & 0x36 1001 0011 & 0011 0110 = 0001 0010 (0x93) (0x36) (0x12)
L'oprateur ou retourne les bits 0 communs aux deux oprandes. Exemple : 0x93 | 0x36 1001 0011 | 0011 0110 = 1011 0111 (0x93) (0x36) (0xB7)
L'oprateur de dcalage de bits vers la gauche, comme son nom l'indique, dcale les bits de l'oprande vers la gauche, du nombre de bits spcifi par le second oprande. Les bits les plus gauche sont donc perdus. Exemple : 0x93 << 2 10010011 010011 = 01001100 (0x93) <<2 (0x4C)
Programmation C sharp/Les oprateurs L'oprateur de dcalage de bits vers la droite, comme son nom l'indique, dcale les bits de l'oprande vers la droite, du nombre de bits spcifi par le second oprande. Les bits les plus droite sont donc perdus. Exemple : 0x93 >> 2 10010011 100100 = 00100100 (0x93) >>2 (0x24)
37
Le test de type
Tester le type d'un objet permet de savoir si son type est d'une classe particulire ou une de ses sous-classes. Il permet galement de savoir si sa classe implmente une interface particulire.
L'oprateur is
Cet oprateur permet de tester le type d'un objet. Le premier argument est l'objet tester, le second doit tre un Type. L'oprateur retourne une valeur de type bool : true si l'objet pass est du type spcifi, false sinon. Syntaxe : expression is type Exemple : Nombre nombre = new Entier(150); if (nombre is Entier) Console.WriteLine("nombre entier"); Cet oprateur quivaut comparer le type retourn par la mthode GetType() avec le type spcifi, tout en grant le cas o la rfrence d'objet est nulle (null).
Les parenthses
Les parenthses permettent de convertir tout type en un autre. La conversion d'objet d'une classe en une autre n'est possible que si le type rel de l'expression convertie est une sous-classe du type spcifi, ou implmente l'interface spcifie. Dans le cas contraire, l'oprateur lance une exception. La syntaxe est la suivante : (nouveau_type)expression Exemple : int longueur = (int)( 10.2 * 3.1415 );
38
L'oprateur as
Contrairement l'oprateur prcdent, l'oprateur as ne fonctionne que sur les rfrences d'objets. Si la conversion ne peut tre effectue (la nouvelle classe n'est pas une classe de base de la classe relle, ou n'est pas une interface implmente par la classe relle), alors la valeur null est retourne (aucune exception lance). La syntaxe est la suivante : expression as nouveau_type Exemple : object o = "Chane de caractre drive de la classe object" as object;
L'affectation simple
L'oprateur = affecte le rsultat de l'expression de droite la variable situe gauche. Exemples : total = 0; total = 1 + 2; total = longueur + largeur; this.article1.nom = "Livre"; N.B.: Cet oprateur est le seul oprateur d'affectation utilisable la dclaration des variables : type identifiant_variable = expression; Exemples : int total = 0; double prix_total_ttc = 1.196 * prix_total_ht; string nom_article = "Livre"; object livre = new Livre("Sans titre");
39
Exemple a += 5; a -= 5; a *= 5; a /= 5; a %= 5;
quivalent a = a + 5; a = a - 5; a = a * 5; a = a / 5; a = a % 5;
N.B.: Un tel oprateur d'affectation ne peut tre utilis la dclaration d'une variable car celle-ci n'existe pas encore lors de l'valuation de l'expression.
40
de gauche droite
*/% +<< >> < <= > >= == != & ^ | && || c?t:f = += -= *= /= %= <<= >>= &= ^= |= ,
Multiplication, division, et modulo (reste d'une division) Addition et soustraction Dcalage de bits vers la droite ou vers la gauche Comparaison infrieur strictement et infrieur ou gal Comparaison suprieur strictement et suprieur ou gal Condition gal et diffrent ET binaire OU exclusif binaire / logique OU binaire ET logique boolen OU logique boolen Oprateur ternaire de condition Affectation Affectation avec somme ou soustraction Affectation avec multiplication, division ou modulo Affectation avec dcalage de bits Affectation avec ET, OU ou OU exclusif binaires Squence d'expressions
de droite gauche
de gauche droite
Vrification du dbordement
Le dbordement provoque une exception System.OverflowException. checked( expression ) Il s'agit du contexte par dfaut pour les expressions constantes, c'est dire celles qui peuvent tre values lors de la compilation.
41
Condition
Une instruction peut s'excuter lorsqu'une condition est vraie. La syntaxe est la suivante : if (expression) instruction expression dfinit la condition et doit tre du type bool, c'est dire qu'elle ne peut valoir que true (vrai) ou false (faux). L'instruction n'est excute que si la condition est vraie (true). Exemple : if (a==10) Console.WriteLine("a vaut 10");
Plusieurs instructions
Pour excuter plusieurs instructions si la condition est vraie, instruction peut tre remplac par un bloc d'instructions entre accolades : { instruction instruction ... } Exemple : if (a==10) { Console.WriteLine("a vaut 10"); a=9; Console.WriteLine("dsormais a vaut 9"); }
Sinon...
Il est possible d'excuter des instructions quand une condition est vraie, et d'autres instructions quand elle est fausse. La syntaxe est la suivante : if (expression) instruction else instruction Exemples : if (a==10) Console.WriteLine("a vaut 10"); else Console.WriteLine("a ne vaut pas 10");
Programmation C sharp/Structures de contrle if ((a==10)&&(b==11)) Console.WriteLine("a vaut 10 et b vaut 11"); else Console.WriteLine("a ne vaut pas 10 ou b ne vaut pas 11");
42
Conditions multiples
L'enchanement des instructions conditionnelles est possible. Exemple : if (a==10) if (b==11) Console.WriteLine("a vaut 10 et b vaut 11"); else Console.WriteLine("a vaut 10 mais b ne vaut pas 11"); else Console.WriteLine("a ne vaut pas 10"); Chaque instruction else correspond au if qui le prcde, s'il n'a pas dj de else. Cependant, pour clarifier le code ou rsoudre certains cas ambigus (pas de else pour le second if, par exemple), il est prfrable de mettre des accolades : if (a==10) { if (b==11) Console.WriteLine("a vaut 10 et b vaut 11"); else Console.WriteLine("a vaut 10 mais b ne vaut pas 11"); } else Console.WriteLine("a ne vaut pas 10"); Autre exemple : if (a==10) Console.WriteLine("a vaut 10"); else if (a==11) Console.WriteLine("a vaut 11"); else Console.WriteLine("a ne vaut ni 10, ni 11"); Dans cet exemple, chaque instruction if n'est teste que si la prcdente est fausse. Si le nombre de cas est important et que chaque condition teste une valeur pour la mme expression, il est prfrable d'utiliser l'instruction switch.
43
... } O cas peut avoir l'une des deux syntaxes suivantes : case constante Cas o l'expression vaut la constante spcifie. default Cas o l'expression ne correspond aucun autre cas (le cas par dfaut). fin du cas est une instruction spciale terminant le ou les cas. Hormis les instructions interrompant le cours de l'excution (une instruction interrompant ou continuant une boucle, une instruction throw pour lancer une exception, une instruction return), il s'agit en gnral de l'une des deux instructions suivantes : break; Fin du test, la prochaine instruction excute est celle situe aprs l'accolade fermante de switch. goto cas; L'excution se poursuit au cas indiqu. Exemple : switch(a) { case 10 : Console.WriteLine("a vaut 10"); break; case 11 : Console.WriteLine("a vaut 11"); break; default : Console.WriteLine("a ne vaut ni 10, ni 11"); break; } La syntaxe permet de rassembler plusieurs cas ensembles pour excuter les mmes instructions : switch(a) { case 2 : case 3 : case 5 : Console.WriteLine("a vaut 2, 3 ou 5"); break; case 10 : case 11 : Console.WriteLine("a vaut 10 ou 11"); break;
44
default : Console.WriteLine("a n'est pas dans la liste (2, 3, 5, 10, 11)"); break; } Il est galement possible de poursuivre le traitement avec les instructions d'un autre cas : switch(a) { case 10 : Console.WriteLine("a vaut 10"); goto case 11; case 11 : Console.WriteLine("a vaut "+a); break; default : Console.WriteLine("a ne vaut ni 10, ni 11"); break; }
Boucles
Une boucle permet d'excuter plusieurs fois une ou des instructions tant qu'une condition est vraie.
Boucle while
La boucle while est la plus simple : tant que la condition est vraie, elle excute l'instruction ou le bloc d'instructions spcifi. Sa syntaxe est la suivante : while ( expression ) instruction_ou_bloc O expression est une expression du type bool, c'est dire valant true (vrai) ou false (faux). Exemple : rechercher une valeur spcifique dans un tableau d'entiers int i = 0; // tant que i est un indice correct et que la valeur 0 n'est pas trouve while ( (i < tableau.Length ) && ( tableau[i] != 0 ) ) { Console.WriteLine(tableau[i]); i++; } N.B.: Si la condition est fausse ds le dbut, l'instruction ou le bloc n'est pas excut, car la condition est teste avant.
45
Boucle do...while
La boucle do...while ressemble la prcdente, except que la condition est teste aprs. C'est dire que le bloc d'instructions est toujours excut au moins une fois. La syntaxe est la suivante : do { instructions } while ( expression ); O expression est une expression de type bool. Exemple : string fichier; do { Console.Write("Entrez un nom de fichier ou rien pour quitter : "); fichier=Console.ReadLine(); if (fichier != "") TraiterFichier(fichier); } while ( fichier != "" );
Boucle for
La boucle for regroupe plusieurs phases de la boucle : L'initialisation, par exemple un indice dans un tableau, La condition, tant qu'elle est vraie la boucle continue, Les instructions excuter, L'instruction (ou les instructions) d'incrmentation, excute(s) juste avant de tester nouveau la condition.
La syntaxe d'une boucle for est la suivante : for ( initialisation ; condition ; incrmentation ) instructions Exemple : recherche d'une valeur nulle dans un tableau d'entiers for ( int i=0 ; (i<tableau.Length)&&(tableau[i]!=0) ; i++ ) Console.WriteLine( tableau[i] );
Boucle foreach
La boucle foreach parcours tous les lments d'un objet implmentant l'interface IEnumerable. Il s'agit d'une version simplifie de la boucle for. La syntaxe est la suivante : foreach ( type variable in objet_IEnumerable) instructions Durant la boucle, la variable variable (de type type) vaut successivement toutes les valeurs retournes par l'objet implmentant l'interface IEnumerable.
Programmation C sharp/Structures de contrle Les tableaux implmentent cette interface, et peuvent donc tre utiliss dans une boucle foreach. Exemple : afficher tous les lments d'un tableau string[] messages = { "Test", "d'une", "boucle foreach" }; foreach ( string s in messages ) Console.WriteLine(s);
46
47
Programmation C sharp/Structures de contrle public class TestProgram { public static void Main() { Mots fruits = new Mots( "pomme", "poire", "abricot", "fraise", "kiwi" ); foreach( string fruit in fruits.TousLesMotsJusquA("fraise") ) Console.WriteLine( fruit ); } } Ce programme affiche : pomme poire abricot Les fruits suivants ne sont pas affichs car le mot "fraise" a t trouv.
48
Syntaxe
La relation d'hritage est dfinie la dclaration de la classe par le symbole deux-points suivi du nom de la super-classe. Exemple de super-classe : public class Vehicule { int roues, places, kilometrage; public Vehicule() { } } Exemple de sous-classe : public class Automobile : Vehicule {
49
Constructeurs
Le constructeur de la sous-classe appelle toujours celui de la classe de base, implicitement ou explicitement. Si rien n'est spcifi, le compilateur gnre un appel implicite au constructeur de la classe de base ne comportant aucun paramtre. C'est pourquoi ce constructeur est nomm constructeur par dfaut . Si la classe de base ne possde aucun constructeur par dfaut, ou si un autre serait plus appropri, il est possible de spcifier explicitement le constructeur appeler. Le mot-cl base dsigne la classe de base. Exemple : public class Vehicule { int roues, places, kilometrage; // Constructeur "protg" : l'accs est limit // cette classe et aux sous-classes protected Vehicule(int roues,int places) { this.roues = roues; this.places = places; } } public class Automobile : Vehicule { string couleur; public Automobile(string couleur) : base( 4, 5 ) // appel au constructeur de Vehicule // 4 roues et 5 places { this.couleur = couleur; } // Ajouter un constructeur par dfaut n'est pas obligatoire // mais permet d'illustrer qu'il est possible d'appeler un // autre constructeur de la mme classe public Automobile() : this( "indfinie" ) // couleur indfinie par dfaut { } }
50
Rfrence d'instance
Une rfrence une instance de la sous-classe peut tre stocke par une rfrence du mme type : Automobile voiture = new Automobile(); Il est galement possible d'utiliser une rfrence du type de la classe de base : Vehicule voiture = new Automobile();
Programmation C sharp/Hritage de classes public class Automobile : Vehicule { private string couleur; public Automobile(int poids,string couleur) : base(poids) { this.couleur = couleur; } // mthode surcharge public new string Description() { return base.Description()+" de couleur "+couleur; } } Utilisation : Automobile voiture = new Automobile(3, "rouge"); Console.WriteLine( voiture.Description() ); // affiche : Vhicule de 3 tonnes de couleur rouge Par contre, si on utilise une rfrence la classe de base Vehicule, la mthode appele sera celle de la classe de base : Vehicule vehicule = new Automobile(3, "rouge"); Console.WriteLine( vehicule.Description() ); // affiche : Vhicule de 3 tonnes Une conversion de la rfrence vers la classe relle de l'objet permet d'appeler la mthode surcharge : Console.WriteLine( ((Automobile)vehicule).Description() ); // affiche : Vhicule de 3 tonnes de couleur rouge Cet exemple n'utilise donc pas le polymorphisme, c'est dire que pour appeler la mthode Description, le compilateur se base sur le type de la rfrence plutt que sur le type rel de l'objet rfrenc.
51
Programmation C sharp/Hritage de classes return "Vhicule de "+poids+" tonnes"; } } Et il faut utiliser le mot cl override dans la classe drive : public class Automobile : Vehicule { private string couleur; public Automobile(int poids,string couleur) : base(poids) { this.couleur = couleur; } // mthode surcharge public override string Description() { return base.Description()+" de couleur "+couleur; } } Utilisation : Vehicule vehicule = new Automobile(3, "rouge"); Console.WriteLine( vehicule.Description() ); // affiche : Vhicule de 3 tonnes de couleur rouge Si le mot cl new est utilis la place du mot cl override, le polymorphisme n'est pas effectif, comme dans le paragraphe prcdent.
52
Rsum
Pour rsumer :
Mthode de la classe de base normale Mthode surcharge dans la Classe drive virtual
Sans polymorphisme, Sans polymorphisme, avertissement CS0108 avertissement CS0114 new Sans polymorphisme Sans polymorphisme Avec polymorphisme
53
Syntaxe
Le mot cl abstract doit prcder la classe abstraite et toutes les mthodes abstraites. Exemple : // Classe abstraite grant un ensemble d'objets public abstract class Ensemble { public bool AjouterSiNeContientPas(object o) { if ( ! Contient(o) ) Ajouter(o); } public bool RetirerSiContient(object o) { if ( Contient(o) ) Retirer(o); } // mthodes abstraites (sans implmentation) : public abstract bool Contient(object o); protected abstract void Ajouter(object o);
54
Proprits abstraites
Il est galement possible de dclarer des proprits abstraites. Exemple : public abstract class Ensemble { public abstract int nombre { get; } public abstract string nom { get; set; } } public class EnsembleTableau : Ensemble { private string nom_ensemble = null;
Programmation C sharp/Classe abstraite private object[] elements = new object[0]; public override int nombre { get { return elements.Count; } } public override string nom { get { return nom_ensemble ; } set { nom_ensemble = value ; } } }
55
Mode d'accs
Puisque les mthodes et proprits abstraites doivent tre implmentes par les sous-classes, il n'est pas possible de les dclarer avec le mot cl private, ou d'utiliser le mot cl sealed avec la classe. De plus les mthodes et proprits abstraites ne peuvent tre statiques.
Programmation C sharp/Les exceptions // Instructions toujours excutes // exception lance ou non instructions } Le bloc try est suivi d'un nombre quelconque de bloc catch (ventuellement aucun) attrapant diffrents types d'exception, et ventuellement d'un bloc finally qui sera toujours excut quoi qu'il se passe. Exemple : try { Console.Write("Entrez un nombre : "); int n = int.Parse( Console.ReadLine() ); Console.WriteLine(" 100/nombre = "+( 100/n )); } catch ( DivideByZeroException dbzex ) { Console.Error.WriteLine(" Division par zro"); } catch ( Exception ex ) { Console.Error.WriteLine( " Une autre exception a eu lieu : "+ex.Message); } finally { Console.WriteLine( " Quel que soit le rsultat, ceci est affich"); }
56
Programmation C sharp/Les exceptions using( Bitmap bm = new Bitmap(100,100) ) // <- objet IDisposable { ... } // <- mthode Dispose() appele automatiquement
57
58
// Proprits (en lecture seule) public int Ligne { get { return ligne; } } public int Colonne { get { return colonne; } } public string Fichier { get { return fichier; } } // Constructeur public ErreurDeScriptException( string message, string fichier, int ligne, int colonne ) : base(message) // appel au constructeur de la classe Exception { this.fichier = fichier; this.ligne = ligne; this.colonne = colonne; } } Ensuite, cette classe peut tre utilise comme n'importe quelle autre classe d'exception : if ( arg==null ) throw new ErreurDeScriptException( "Un argument est ncessaire", fichier_script, 10 , 5);
59
Syntaxe
struct nom_de_structure { type variable; } Exemple : struct Point { public double x; public double y; }
Mthodes
Comme pour une classe, il est possible d'ajouter des mthodes. Exemple : struct Point { public double x; public double y; public void MoveTo(double x,double y) { this.x=x; this.y=y; } }
60
numration
Une numration est un type de donnes dont les valeurs sont des constantes nommes.
Syntaxe
enum nom_numration { nom, nom ... }; Exemple : enum JourDeSemaine { LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE };
61
Combinaison de constantes
En affectant des valeurs diffrentes de puissances de 2 aux constantes, l'oprateur ou ( | ) est utilisable pour combiner plusieurs constantes. Exemple : [Flags] enum Droits { LECTURE = 1, ECRITURE = 2, EFFACER = 4 }; Droits d = Droits.LECTURE | Droits.EFFACER; Console.WriteLine("droits : "+d); // affiche droits : LECTURE, EFFACER Console.WriteLine("droits : "+(int)d); // affiche droits : 5 L'attribut Flags indique au compilateur que plusieurs constantes peuvent tre combines. La mthode ToString de cet enum affiche alors toutes les constantes utilises. L'oprateur et ( & ) permet de tester si une constante appartient l'ensemble : if ( (d & Droits.LECTURE) != 0) Console.WriteLine(" lecture autorise"); if ( (d & Droits.ECRITURE) != 0) Console.WriteLine(" criture autorise");
Programmation C sharp/Interfaces
62
Programmation C sharp/Interfaces
Une interface ne fait que dcrire une liste de mthodes, sans implmentation. Le code de ces mthodes est fourni par les classes qui implmentent l'interface.
63
Hritage
Une interface peut hriter d'une autre interface. Elle possde donc les mmes dclarations que l'interface de base en plus de ces propres dclarations. En outre, elle peut tre utilise l ou une implmentation de l'interface de base est requise. Exemple : public interface IDrawable { public void Draw(); } public interface IPrintable : IDrawable { public void Print(); } public class Cercle : IPrintable
Programmation C sharp/Interfaces { public void Draw() { ... } public void Print() { ... } } ... public void Methode() { IDrawable drawable = new Cercle(); // ^ conversion implicite de IPrintable vers IDrawable drawable.Draw(); }
64
Rfrences
[1] http:/ / msdn. microsoft. com/ fr-fr/ library/ 75e8y5dd%28VS. 80%29. aspx
65
Programmation avance
Programmation C sharp/Type partiel
Le langage C# permet d'implmenter les classes, les structures et les interfaces sur plusieurs fichiers. Visual Studio .Net utilise cette fonctionnalit pour les fentres graphiques : une partie de la classe Form1 est implmente dans le fichier Form1.cs et l'autre dans le fichier Form1.Designer.cs.
Syntaxe
Chaque fichier implmentant une partie d'un type doit faire prcder le mot cl du type (class, struct ou interface) du mot cl partial : mode_accs partial type nom ... { ... } Exemple : public partial class Exemple { } Il n'est pas ncessaire que tous les fichiers prcisent le mode d'accs ou la classe de base.
Compilation
la compilation d'un type partiel, tous les fichiers sources concerns doivent tre spcifis sur la ligne de commande d'appel au compilateur.
66
Syntaxe
L'oprateur surdfini doit toujours tre statique et public, sinon le compilateur gnre une erreur. L'oprateur est dclar en utilisant le mot cl operator suivi de l'oprateur surdfini. Exemple : public class NombreComplexe { private double n_reel, n_imag; public NombreComplexe() {} public NombreComplexe(double r,double i) { this.n_reel = r; this.n_imag = i; } public static NombreComplexe operator + (NombreComplexe a,NombreComplexe b) { return new NombreComplexe ( a.n_reel + b.n_reel , a.n_imag + b.n_imag ); } }
Programmation C sharp/Surcharge des oprateurs public static bool operator > (NombreComplexe a,NombreComplexe b) { return b < a; } operator <= en fonction de operator >= public static bool operator <= (NombreComplexe a,NombreComplexe b) { return b >= a; } operator >= en fonction de operator <= public static bool operator >= (NombreComplexe a,NombreComplexe b) { return b <= a; } operator == en fonction de operator != public static bool operator == (NombreComplexe a,NombreComplexe b) { return !( a != b ); } operator != en fonction de operator == public static bool operator != (NombreComplexe a,NombreComplexe b) { return !( a == b ); }
67
Oprateurs de conversions
Les oprateurs de conversions sont dclars dans une classe C en ajoutant une mthode utilisant la syntaxe suivante : operator type_cible(type_source valeur) o l'un des deux types est la classe C : convertir un objet de classe C vers type_cible ou un objet de type type_source vers classe C. Exemple: public class Fraction { private int numerateur, denominateur; public Fraction(int n, int d) { this.numerateur = n; this.denominateur = d; } public double GetValue() { return this.numerateur / this.denominateur; }
Programmation C sharp/Surcharge des oprateurs public static implicit operator double(Fraction f) { return f.GetValue(); } public static implicit operator Fraction(int entier) { return new Fraction(entier, 1); } } ... Fraction f=new Fraction(1,3); double d = f; // -> 0.33333... ... Fraction f; f = 5; // -> 5 / 1
68
Explicite/Implicite
L'oprateur de conversion doit tre dclar avec l'un des mots-cls implicit ou explicit pour qu'il soit utilis respectivement implicitement ou explicitement. Exemple: public class Fraction { private int numerateur, denominateur; public Fraction(int n, int d) { this.numerateur = n; this.denominateur = d; } public double GetValue() { return this.numerateur / this.denominateur; } public static explicit operator Fraction(int entier) { return new Fraction(entier, 1); } } ... Fraction f; f = (Fraction)5; // conversion explicite -> 5 / 1
69
Avertissements du compilateur
Lors de la compilation, des avertissements sont gnrs pour attirer le programmeur sur certaines instructions du fichier source potentiellement ambigus ou dangereuses. Si le programmeur, aprs vrification de l'endroit indiqu, estime que le danger potentiel ne peut arriver, ou qu'il s'agit bien de ce qu'il faut faire, il est possible d'enlever les avertissements dans une zone du fichier source afin que les avertissements inutiles ne soit plus gnrs.
Ignorer un avertissement
Pour ignorer un avertissement, la directive est la suivante : #pragma warning disable codes O codes est la liste des codes des avertissements ignorer. Ces codes correspondent ceux affichs par le compilateur, sans le prfixe "CS".
70
Restaurer un avertissement
Pour restaurer la gnration d'un avertissement, c'est dire ne plus l'ignorer, la directive est la suivante : #pragma warning restore codes O codes est la liste des codes des avertissements restaurer.
Symboles de compilation
Un symbole est dfini avec la directive #define. Il possde un nom, et ventuellement une valeur. Le compilateur substitue la valeur du symbole au nom de celui-ci. La syntaxe est la suivante : #define nom_du_symbole [valeur] valeur est optionnel. Exemple : #define MAX_PAGES 100 private Page[] livre = new Page[MAX_PAGES]; Le symbole est dfini jusqu' la fin ou jusqu' la directive #undef correspondante. La syntaxe de cette directive est la suivante : #undef nom_du_symbole Exemple : #undef MAX_PAGES
Lorsqu'aucune valeur n'est associe au symbole, celui-ci ne peut servir que pour une compilation conditionnelle.
Compilation conditionnelle
La syntaxe gnrale des directives de compilation conditionnelle est la suivante : #if condition compiler si la condition est vraie #elif condition sinon, compiler si la condition est vraie ...#elif... #else compiler sinon
71
#endif Les blocs #elif et #else sont optionnels. La condition peut avoir l'une des syntaxes suivantes : nom_symbole Retourne vrai si le symbole spcifi est dfini. !condition Retourne vrai si la condition est fausse, et vice-versa. condition && condition Retourne vrai si les deux conditions sont vraies (ET logique). condition || condition Retourne vrai si au moins l'une des deux conditions est vraie (OU logique). (condition) Priorit d'valuation. La compilation conditionnelle est souvent utilise pour les fonctions de dboggage. Par exemple : #if DEBUG // Fonction de dboggage public void trace(string message) { Console.WriteLine(message); } #endif public void traitement() { #if DEBUG trace("Dbut de la fonction traitement()"); #endif ... #if DEBUG trace("Fin de la fonction traitement()"); #endif } Pour ce genre de condition, l'attribut Conditionnal est plus simple utiliser : // Fonction de dboggage [Conditionnal("DEBUG")] public void trace(string message) { Console.WriteLine(message); } public void traitement() {
Programmation C sharp/Directives du prprocesseur trace("Dbut de la fonction traitement()"); ... trace("Fin de la fonction traitement()"); }
72
73
Syntaxe
Les commentaires de documentation commencent par un triple slash /// et se termine au prochain retour la ligne. Le contenu de ces commentaires est au format XML. Il est possible d'utiliser plusieurs lignes. Exemple : /// <summary> /// Une classe pour dmontrer /// les commentaires de documentation /// </summary> public class Exemple { ... } Depuis la version 2003 du compilateur C# (pour la normalisation ECMA), il est galement possible d'utiliser des blocs de commentaires /** ... */ : /** <summary> Une classe pour dmontrer les commentaires de documentation </summary> */ public class Exemple { ... } Il est possible de mlanger les deux styles, mais non recommand pour la lisibilit du code : /** <summary> Une classe pour dmontrer les commentaires de documentation */ /// </summary> public class Exemple { ... }
74
Gnrer la documentation
Le compilateur C# est capable de gnrer un fichier XML partir des fichiers sources.
Windows csc /doc:fichier.xml fichier_source.cs
Programmation C sharp/Documentation XML des classes <see cref="membre"> Rfrence dans le texte une classe ou un de ses membres en relation avec l'entit dcrite. <list type="type_de_liste"> Une liste ou un tableau. type_de_liste peut valoir bullet (liste non ordonne), number (liste numrote) ou table (tableau). Il est galement possible d'ajouter ses propres balises XML. La balise <list> contient les balises suivantes : <listheader> En-tte de tableau. <item> Ligne de tableau. Ces balises contiennent : <term> Terme dfini. <description> Description correspondante. L'attribut cref peut en fait s'appliquer toute balise XML pour faire rfrence une autre entit (classe, mthode, proprit, ...). Il est galement possible d'utiliser un fichier XML spar pour documenter plusieurs entits, en utilisant la balise include : <include file="chemin_du_fichier_xml" path="chemin_XPath" /> Copier les balises XML spcifies par le chemin XPath dans le fichier spcifi.
75
Visualiser la documentation
Visualiser directement le fichier XML tel quel n'est pas trs pratique. Il est possible d'utiliser des logiciels de visualisation spcialiss, ou bien d'utiliser un navigateur supportant XML et XSL (Internet Explorer et Firefox par exemple). Pour cela, plusieurs feuilles de style (stylesheet en anglais) sont tlchargeables depuis internet : http://www.codeproject.com/soap/XMLDocStylesheet.asp [1] Puis il faut modifier le fichier XML produit en ajoutant la ligne suivante juste aprs la premire balise <?xml ...?> : <?xml-stylesheet type="text/xsl" href="''nom_du_fichier''.xsl"?> En double-cliquant sur le fichier XML sous Windows, le navigateur applique la transformation dcrite par la stylesheet indique pour afficher une version HTML plus prsentable que le format initial. Cependant la feuille de transformation fournie par MSDN comporte quelques problmes : Les types gnriques ne sont pas correctement prsents et laisss tel qu'ils sont dans le fichier XML initial : un ou deux apostrophes inverses indiquent le nombre ou l'indice des paramtres gnriques. Par exemple : Affiche``2(string, ``1, ``0) reprsente Affiche<T0,T1>(string, <T1>, <T0>), Les rfrences dans les balises XML seealso ne sont pas affiches. Pour corriger ce problme, remplacer cref par @cref dans la feuille de style :
76
En savoir plus
(fr) Balises recommandes pour les commentaires de documentation [2] (fr) Laboratoire 2 : Commentaires XML [3]
Rfrences
[1] http:/ / www. codeproject. com/ soap/ XMLDocStylesheet. asp [2] http:/ / msdn2. microsoft. com/ fr-fr/ library/ 5ast78ax(VS. 80). aspx [3] http:/ / www. microsoft. com/ france/ msdn/ articles/ vstudio/ vsnet_labs2. mspx
Programmation C sharp/Attributs
En C#, chaque dclaration de classe, mthode, proprit, ou variable peut tre prcde d'un ou plusieurs attributs.
Syntaxe d'utilisation
Un attribut comporte un nom et ventuellement des paramtres. Il est encadr par des crochets. Par exemple, Visual Studio .NET gnre la fonction Main() de la manire suivante : ... [STAThread] public static void Main() { ... } ... L'attribut associ la mthode Main() est nomm STAThread et ne comporte aucun paramtre.
Programmation C sharp/Attributs Par convention, toute classe dfinissant un attribut doit porter un nom se terminant par Attribute. Ce suffixe est optionnel, le compilateur recherchera d'abord le nom indiqu, puis s'il ne trouve pas la classe, il ajoute le suffixe pour effectuer une seconde recherche.
77
Programmation C sharp/Attributs
78
return : attributs concernant la valeur retourne par la mthode, le dlgue, l'accesseur get ou set d'une proprit, param : attributs concernant un paramtre (mthode, dlgue, accesseur set d'une proprit, accesseur add ou remove d'un vnement), field : attributs concernant le champ, ou l'vnement, property : attributs concernant la proprit ou l'indexeur, event : attributs concernant l'vnement.
Crer la classe
Pour crer un nouvel attribut, il faut crer une classe drivant de la classe System.Attribute, et la nommer avec le suffixe Attribute. Exemple : using System; public class ExempleAttribute : Attribute { } Cet attribut peut dj tre utilis tel qu'il est, sans paramtres : [Exemple] public class UneClasse { [method:Exemple] [return:Exemple] public int UneMethode(int UnParametre) { return UnParametre;
Programmation C sharp/Attributs } }
79
Programmation C sharp/Attributs [return:Exemple("Retourne le paramtre pass")] public int UneMethode(int UnParametre) { return UnParametre; } }
80
Dfinir la cible
Par dfaut l'attribut concerne tous les types de cibles (All). Pour dfinir les cibles que l'attribut peut concerner, il faut utiliser l'attribut System.AttributeUsage sur la classe de l'attribut. Exemple : using System; [ AttributeUsage( AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false ) ] classe ou structure public class ExempleAttribute : Attribute { private string titre; public ExempleAttribute(string titre) {
Programmation C sharp/Attributs this.titre = titre; numero = 0; // valeur par dfaut } public int numero; } [Exemple("Un exemple de classe", numero=1)] public class UneClasse { // erreur de compilation pour les 2 attributs suivants // car l'attribut ne peut concerner une mthode ou une valeur de retour [method:Exemple("Une mthode")] [return:Exemple("Retourne le paramtre pass", numero=2)] public int UneMethode(int UnParametre) { return UnParametre; } } // erreur de [Exemple("Un [Exemple("Un public class { } compilation car l'attribut est utilis plus d'une fois autre exemple de classe", numero=1)] exemple de classe", numero=2)] UneAutreClasse
81
L'numration AttributeTargets possde les valeurs suivantes : All : toutes les cibles possibles. Cette valeur est la combinaison par ou logique de toutes les autres valeurs, Assembly, Module, Class : dclaration d'une classe, Struct : dclaration d'une structure, Interface : dclaration d'une interface, Constructor : constructeur d'une classe, Delegate, Event, Enum, Field, Method : dclaration d'une mthode, Property : dclaration d'une proprit, Parameter, ReturnValue, GenericParameter : paramtre d'un gnrique (template).
Programmation C sharp/Attributs
82
Attributs prdfinis
Le langage C# dfinit un nombre d'attributs ayant un rle spcifique lors de la compilation.
Attribut Conditional
L'attribut System.Diagnostics.ConditionalAttribute s'applique une mthode qui ne doit tre appele et dfinie que si le symbole spcifi est dfini. Il peut s'agir par exemple d'une mthode de dboggage. Le symbole DEBUG est souvent utilis pour distinguer les versions Debug et Release des projets sous Visual Studio. Exemple : [Conditional("DEBUG")] public void trace(string message) { ... } Si l'attribut est utilis plus d'une fois, la mthode n'est appele et dfinie que si l'un des symboles est dfini (Ou logique) : [Conditional("DEBUG"),Conditional("FORCEDEBUG")] public void trace(string message) { ... } Cet attribut vite d'encadrer systmatiquement chaque appel de la mthode par des directives #if...#endif. Il est galement applicable aux classes d'attributs. Dans ce cas, les informations associes l'attribut ne sont ajoutes que si le symbole est dfini. Par exemple :
Programmation C sharp/Attributs [Conditional("DEBUG")] public class Documentation : System.Attribute { string text; public Documentation(string text) { this.text = text; } } class ExempleDeClasse { // Cet attribut ne sera inclus que si DEBUG est dfini. [Documentation("Cette mthode affiche un entier.")] static void DoWork(int i) { System.Console.WriteLine(i.ToString()); } }
83
Attribut Obsolete
L'attribut System.ObsoleteAttribute est utilis pour marquer une entit dont l'utilisation n'est plus recommande. Le compilateur peut alors gnrer une erreur ou un avertissement selon les paramtres de l'attribut. [Obsolete("Utilisez plutt UneNouvelleMethode()")] public void UneAncienneMethode() { ... } Lors de l'appel la mthode : UneAncienneMethode();
le compilateur gnrera un avertissement comportant le message spcifi : Utilisez plutt UneNouvelleMethode() Si une valeur boolenne est spcife la suite du message, elle indique si une erreur doit tre gnre au lieu d'un avertissement. Exemple : [Obsolete("Utilisez plutt UneNouvelleMethode()",true)] public void UneAncienneMethode() { ... } Lors de l'appel cette mthode, le compilateur gnrera une erreur comportant le message spcifi : Utilisez plutt UneNouvelleMethode()
Programmation C sharp/Attributs
84
Attribut AttributeUsage
L'attribut System.AttributeUsageAttribute dj vu prcdemment, indique l'utilisation d'une classe attribut. Le seul paramtre obligatoire est une valeur ou une combinaison de System.AttributeTargets indiquant les cibles acceptables pour l'attribut. valeurs de l'numration
Le paramtre AllowMultiple (bool, false par dfaut) indique si l'attribut peut tre utilis plusieurs fois pour la mme cible. Le paramtre Inherited (bool, true par dfaut) indique si l'attribut est hrit par les sous-classes.
Attribut DllImport
L'attribut System.Runtime.InteropServices.DllImportAttribute permet d'importer une fonction dfinie dans une DLL externe. Le nom de la DLL o la fonction est dfinie est le seul paramtre obligatoire.
Attribut Flags
L'attribut System.FlagsAttribute s'applique aux numrations pour indiquer que plusieurs valeurs peuvent tre combines avec l'oprateur ou ( | ). Cet attribut indique au compilateur de grer les combinaisons de constantes dans la mthode ToString() de cette numration.
Attribut ThreadStatic
L'attribut System.ThreadStaticAttribute s'applique aux variables membres statiques. Cet attribut indique que la variable est alloue pour tout nouveau thread. Ce qui signifie que chaque thread possde une instance diffrente de la variable. L'initialisation d'une telle variable la dclaration n'est effectue que pour l'instance du thread ayant charg la classe.
85
Syntaxe
La dclaration d'un dlgu dfinit la signature d'une mthode, dont le type de retour est prcd du mot cl delegate. Exemple : public delegate int CompareDelegate(object a,object b); Cette dclaration produit en fait une classe CompareDelegate drivant de la classe System.Delegate. Il est donc possible de la placer en dehors de toute classe ou espace de noms, comme pour une classe normale.
Utilisation
Ce dlgu dfinit donc un nouveau type qui peut tre utilis en paramtre d'une mthode. L'appel un dlgu utilise la mme syntaxe que celle d'une mthode. Exemple : public void TrierTableau(object[] objects, CompareDelegate compare) { int moves; // Vrifier que le dlgu pointe sur une mthode : if (compare==null) return; do { moves = 0; for (int i=1 ; i<objects.Length ; i++) // Si objects[i-1] > objects[i] // appel au dlgu pour comparer deux objets if ( compare( objects[i-1], objects[i]) > 0 ) { // Echange des deux objets mal ordonns object o=objects[i-1]; objects[i-1]=objects[i]; objects[i]=o; moves++; // un change de plus } } while (moves!=0); }
86
Instanciation
Une variable du type dlgu peut tre dclare, comme avec une classe normale : CompareDelegate comparateur; Initialement, cette variable vaut null car ne rfrence aucune mthode.
Dlgu anonyme
Il est possible de crer dynamiquement la fonction associe un dlgu en utilisant la syntaxe anonyme suivante : delegate( arguments ) { code } Exemple : affichage += delegate(string m) { Console.WriteLine("Nouveau message : "+m); } La spcification des arguments est optionnelle, condition qu'aucun des arguments ne soit utilis par la fonction. Ce qui ne peut tre le cas si un des arguments est de type out, car la fonction doit obligatoirement lui attribuer une valeur.
Programmation C sharp/Delegates et events Exemple : affichage += delegate { Console.WriteLine("Fonction qui n'utilise pas les arguments"); }
87
Les vnements
Un vnement (event en anglais) est dclench en dehors de l'application, par l'utilisateur (frappe au clavier, clic d'un bouton de souris, ...), par le systme (connexion rseau, ...), par une autre application.
Solution : event
Les trois problmes cits prcdemment sont rsolus par le mot cl event : public delegate void PageRecueDelegate(string url, string contenu); public class ConnectionHttp { public event PageRecueDelegate PageRecue; }
Programmation C sharp/Delegates et events Ce mot cl protge l'accs au dlgu de la manire suivante : Il n'est plus possible d'utiliser l'affection seule (oprateur =), il faut utiliser += ou -= ; L'ajout et le retrait sont raliss de manire synchrone, Il n'est pas possible d'appeler le delegate en dehors de la classe o l'event est dclar.
88
Fonctionnement interne
La protection est ralise de la manire suivante : Le vritable membre dlgu est priv (mme si l'event est public) ; L'utilisation des oprateurs += et -= est ralise par des appels aux accesseurs add et remove de l'event. Il est possible de remplacer les accesseurs par dfaut crs par le compilateur. Pour l'exemple prcdent, les accesseurs par dfaut sont dfinis ainsi : public delegate void PageRecueDelegate(string url, string contenu); public class ConnectionHttp { private PageRecueDelegate PageRecue; public event PageRecueDelegate PageRecue { [MethodImpl(MethodImplOptions.Synchronized)] add // paramtre value : fonction ajouter { PageRecue = Delegate.Combine(PageRecue, value); } [MethodImpl(MethodImplOptions.Synchronized)] remove // paramtre value : fonction retirer { PageRecue = Delegate.Remove(PageRecue, value); } } }
89
Syntaxe
Les types gnriques sont identifis par un nom, et spcifis entre les signes < et > placs juste aprs le nom de la mthode ou la classe.
Exemple de mthode
Soit une mthode statique retournant la valeur maximale entre deux valeurs passes en paramtre : public static T max<T>(T a, T b) // Retourne la valeur maximale { return a > b ? a : b ; } int entier = max ( 10 , 22 ); double vmax = max ( 3.14 , 1.618 ); Le compilateur dtermine le type utilis pour T d'aprs les valeurs des arguments. Dans le cas prcdent, il gnre deux versions de la fonction : public static int max(int a, int b) public static double max(double a, double b)
Exemple de classe
La syntaxe est similaire. Soit une classe grant une structure en arbre de type quelconques : public class Arbre<T> { public T valeur; private Arbre<T> _gauche, _droite; public Arbre<T> ArbreGauche { get { return _gauche; } } } L'utilisation de cette classe exige de spcifier explicitement le type utilis : Arbre<int> ArbreDesEntiers = new Arbre<int>(); ArbreDesEntiers.valeur = 100;
90
Exemple de structure
Les types gnriques sont galement utilisables avec les structures : public struct Taille<T> { public T largeur, hauteur; }
Syntaxe
Pour chaque type contraindre, il faut ajouter une clause where : where type : liste_des_interfaces Exemple : public class TableauTriable<T> where T : IComparable { //... } Il est possible d'utiliser class ou struct pour limiter le type une classe ou une structure. Exemple : public class TableauTriable<T> where T : struct { //... } Il est galement possible d'ajouter des contraintes sur les constructeurs du type gnrique : public class TableauTriable<T> where T : new() // T doit avoir un constructeur sans paramtre { public T Creer() {
91
Oprateur default
L'oprateur default retourne la valeur par dfaut du type gnrique spcifi. Il s'agit de la valeur quand une variable de ce type n'est pas initialise (0 pour les nombres, null pour les types rfrences). Exemple: public T maxAbsolu(T a,T b) { if (a==b) return default(T); else return a>b ? a : b; }
Alias
Il est possible de dfinir un alias d'une classe gnrique spcifique, en utilisant le mot cl using : using Entiers = TableauTriable<int>; Entiers entiers = new Entiers(); Equivaut : TableauTriable<int> entiers = new TableauTriable<int>();
92
Syntaxe
La mthode externe doit tre dclare comme statique (mot cl static) et externe (mot cl extern) ce qui signifie qu'il ne faut aucun bloc de code. Cette mthode doit obligatoirement utiliser l'attribut DllImport de l'espace de nom System.Runtime.InteropServices afin de dclarer le nom de la DLL utilise et d'autres paramtres optionnels permettant l'interoprabilit avec l'application .Net. Il est conseill de dclarer ces mthodes externes dans une classe spare.
Exemple
using System.Runtime.InteropServices; public class Win32 { [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern IntPtr MessageBox (int hWnd, String text, String caption, uint type); } public class HelloWorld { public static void Main() { Win32.MessageBox (0, "Hello World", "Platform Invoke Sample", 0); } }
En savoir plus
Prsentation dtaille de l'appel de plate-forme [1]
Rfrences
[1] http:/ / msdn2. microsoft. com/ fr-fr/ library/ 0h9e9t7d(VS. 80). aspx
93
Le recours du code non vrifi peut tre ncessaire pour utiliser le systme d'exploitation, un priphrique accd par adresse mmoire, ... Le code non vrifi doit obligatoirement tre marqu avec le mot-cl unsafe. Ce qui permet d'empcher son excution dans un contexte non sr (code provenant d'une source non fiable).
Dclaration
Le mot-cl unsafe peut tre ajout la dclaration d'une mthode comme dans l'exemple suivant : public unsafe void Methode() { int iData = 10; int* pData = &iData; Console.WriteLine("Data contient " + *pData); Console.WriteLine("Son addresse est " + (int)pData ); } Il est galement possible de l'ajouter pour un bloc d'instruction seul : public void Methode() { int iData = 10; unsafe { int* pData = &iData; Console.WriteLine("Data contient " + *pData); Console.WriteLine("Son addresse est " + (int)pData ); } }
94
Pointeurs
Un pointeur est un type qui stocke une adresse vers une donne du type spcifi par le pointeur. La syntaxe d'utilisation est la mme que dans les langages C et C++.
Dclaration
La dclaration d'un pointeur utilise un type suivi du caractre toile. Exemple : int* pEntier; // Pointeur d'entier
Drfrencer un pointeur
Un pointeur utilis directement donnera l'adresse de la variable. Pour utiliser le contenu point par le pointeur il faut le drfrencer en le faisant prcder du caractre toile *. Exemple : *pEntier = 100; // modification de la variable total
Pointeur et tableau
L'adresse d'un tableau est donne sans utiliser l'oprateur d'adresse &. Toutefois, il n'est pas possible de modifier l'adresse du tableau afin d'viter de perdre l'adresse de dbut du tableau. Le pointeur doit utiliser le mot-cl fixed pour obtenir l'adresse d'un tableau. Exemple : int[] valeurs = new int[10]; fixed (int* pEntier = valeurs) for (int iIndex = 0; iIndex < 10; iIndex++) Console.WriteLine( *(pEntier + iIndex) );
95
Gestion de la mmoire
Le mode non vrifi permet de modifier le comportement du ramasse-miettes.
96
API .Net
Programmation C sharp/Interfaces graphiques
Les applications de la plateforme .Net construisent leur interface graphique partir de forms.
Espaces de nom
Les deux principaux espaces de nom de l'interface graphique sont : System.Windows.Forms Cet espace de nom contient les classes correspondant aux divers composants de l'interface graphique (fentre, bouton, label, ...). System.Drawing Cet espace de nom gre le dessin dans un composant (ligne, rectangle, texte, image, ...).
Compilation
Si l'application possdant une interface graphique n'a pas besoin de console, il est possible de la supprimer en spcifiant winexe pour le paramtre target dans la ligne de commande du compilateur :
Windows csc /t:winexe fichier.cs
97
// Le label "Hello world !" message = new Label(); message.Text = "Hello World !"; message.AutoSize = true; // Taille selon le contenu message.Location = new Point(50, 30);// Position x=50 y=30 // Le bouton "Fermer" fermer = new Button(); fermer.Text = "Fermer"; fermer.AutoSize = true; // Taille selon le contenu fermer.Location = new Point(50, 60);// Position x=50 y=60 fermer.Click += new System.EventHandler(fermer_Click); // Ajouter les composants la fentre Controls.Add(message); Controls.Add(fermer); ResumeLayout(false); PerformLayout(); } // Gestionnaire d'vnement private void fermer_Click(object sender, EventArgs evt) { // Fin de l'application : Application.Exit(); } static void Main() { // Pour le style XP : Application.EnableVisualStyles(); // Lancement de la boucle de messages // pour la fentre passe en argument : Application.Run(new PremiereFenetre()); } } Les proprits des composants sont initialises. Puis les composants sont ajouts la collection Controls des composants de la fentre. La gestion de l'vnement du clic sur le bouton se fait l'aide de l'event Click. Si la compilation se droule bien, le lancement de l'application affiche la fentre suivante :
98
Cette fentre est redimensionnable, mais ne peut tre plus petite que la taille minimale spcifie dans le fichier source par la proprit MinimumSize.
Les diteurs disponibles sont : Visual Studio et sa version Express gratuite, le plus diffus SharpDevelop, un diteur dvelopp par une communaut de passionns MonoDevelop, un diteur dvelopp par le projet Mono
Les composants
Tous les composants ont pour classe de base System.Windows.Forms.Control. Cette classe dfinit les fonctionnalits communes tous les composants.
Les vnements
La gestion des vnements est assure par l'utilisation d'events dont la mthode delegate correspondante a la signature suivante : void nom_method(object sender, nom_vnementEventArgs e) Le premier argument indique la source de l'vnement (le contrle). Le deuxime argument donne des informations sur l'vnement (position de la souris, touche utilise, ...).
99
Un premier graphique
using using using using using using System; System.ComponentModel; System.Collections.Generic; System.Drawing; System.Drawing.Drawing2D; System.Windows.Forms;
namespace test { public partial class Form1 : Form { private int yPos = 40; private PictureBox pictureBox1; private Graphics g; public Form1() { this.InitializeComponent(); this.Show(); } private void InitializeComponent() { this.pictureBox1 = new PictureBox(); ((ISupportInitialize) this.pictureBox1).BeginInit(); this.SuspendLayout(); // // pictureBox1 // this.pictureBox1.Location = new Point(12, 12); this.pictureBox1.Name = "pictureBox1"; this.pictureBox1.Size = new Size(268, 112); this.pictureBox1.TabIndex = 0; this.pictureBox1.TabStop = false; // // Form1
Programmation C sharp/Interfaces graphiques/Graphique vectoriel // this.ClientSize = new Size(292, 141); this.Controls.Add(this.pictureBox1); this.Name = "Form1"; ((ISupportInitialize) this.pictureBox1).EndInit(); this.ResumeLayout(false); } static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } private void Show() { Bitmap bmp = new Bitmap( pictureBox1.Width, pictureBox1.Height); using (Graphics image = Graphics.FromImage(bmp)) { Pen myPen1 = new Pen(Color.Red); Pen myPen2 = new Pen(Color.Black); myPen1.Width = 5; myPen2.Width = 5; SolidBrush myBrush = new SolidBrush(Color.Red); Font myFont = new Font("Times New Roman", 24); // smile image.DrawLine(myPen2, 10, 5, 20, 5); image.DrawLine(myPen2, 55, 5, 65, 5); image.DrawBezier(myPen2, 15, 15, 15, 40, 60, 40, 60, 15); image.DrawString("~heLLo wErld ~", myFont, myBrush, 10, (this.yPos = this.yPos + 25)); } // using pictureBox1.Image = bmp; } } } Les mthodes appliques ici sont issues de la classe Graphics de .NET.
100
Programmation C sharp/Interfaces graphiques/Graphique vectoriel Pour afficher l'image il faut initialiser auparavant un constructeur de cette classe ou l'appeler par un vnement on_click par exemple.
101
Quelques mthodes
La classe Graphics comprend de nombreuses autres mthodes du genre. Dont : 1. DrawArc : Dessine un arc reprsentant une partie d'une ellipse indique par une paire de coordonnes, d'une largeur, et d'une taille. 2. DrawBezier : Dessine une cannelure de Bzier dfinie par quatre structures de point. 3. DrawBeziers : Tire une srie de cannelures de Bzier d'un choix de structures de point. 4. DrawClosedCurve : Dessine une cannelure cardinale ferme dfinie par un choix de structures de point. 5. DrawCurve : Dessine une cannelure cardinale par un choix indiqu de structures de point. 6. DrawEllipse : Dessine une ellipse dfinie par un rectangle de bondissement indiqu par une paire des coordonnes, d'une taille, et d'une largeur. 7. DrawIcon : Dessine l'image reprsente par l'icne indique aux coordonnes indiques. 8. DrawIconUnstretched : dessine l'image reprsente par l'icne indique sans mesurer l'image. 9. DrawImage : Dessine l'image indique l'endroit indiqu et avec le format document. 10. DrawImageUnscaled : Dessine l'image indique en utilisant son taille physique originale l'endroit indiqu par une paire du mme rang. 11. DrawImageUnscaledAndClipped : dessine l'image indique sans graduation et agrafes il, au besoin, l'ajustement dans le rectangle indiqu. 12. DrawLine : Trace une ligne reliant les deux points indiqus par les paires du mme rang. 13. DrawLines : Dessine une srie de ligne segments qui relient un choix de structures de point. dessine un GraphicsPath. 14. DrawPie : Dessine une forme de pt en crote dfinie par une ellipse indique par une paire du mme rang, une largeur, une taille, et deux lignes radiales. 15. DrawPolygon : Dessine un polygone dfini par un choix de structures de point. 16. DrawRectangle : Dessine un rectangle indiqu par une paire du mme rang, une largeur, et une taille. 17. DrawRectangles : Dessine une srie de rectangles indiqus par des structures de Rectangle. Cordon Surcharg. Dessine la corde indique des textes l'endroit indiqu avec la brosse indique et la police objecte.
102
Le delegate AsyncCallback
La syntaxe du delegate AsyncCallback est la suivante : public delegate void AsyncCallback(IAsyncResult result) Le paramtre result est une interface de type IAsyncResult correspondant celui retourn par la mthode Begin, et doit tre pass la mthode End.
L'interface IAsyncResult
L'interface IAsyncResult possde les proprits en lecture seule suivantes : object AsyncState Cet objet correspond celui transmis la mthode Begin. WaitHandle AsyncWaitHandle
Programmation C sharp/Fonctions asynchrones Cet objet de synchronisation est mis dans l'tat signal quand l'opration est termine. bool IsCompleted Ce boolen vaut true (vrai) lorsque l'opration est termine. bool CompletedSynchronously Ce boolen vaut true (vrai) si l'opration s'est termine de manire synchrone.
103
Programmation C sharp/Threads et synchronisation + Thread.CurrentThread.GetHashCode()); //... } // Dmarre un nouveau thread pour la mthode longTask() public void StartLongTask() { Console.WriteLine("Cration d'un thread partir du thread " + Thread.CurrentThread.GetHashCode()); Thread th = new Thread( new ThreadStart( this.longTask ) ); th.Start(); } Exemple 2 : Une mthode acceptant un paramtre. // La tche qui prend du temps ... private void telecharger(string url) { Console.WriteLine("Dbut du tlchargement de " + url + " dans le thread " + Thread.CurrentThread.GetHashCode()); //... } // Dmarre un nouveau thread pour la mthode telecharger() public void CommencerATelecharger(string url) { Console.WriteLine("Cration d'un thread partir du thread " + Thread.CurrentThread.GetHashCode()); Thread th = new Thread( new ParameterizedThreadStart( this.telecharger ) ); th.Start( url ); } Exemple 3 : Si la mthode doit accepter plusieurs paramtres, il faut passer un tableau de paramtres. Puisqu'un tableau est egalement un objet, le tableau peut tre pass sous la forme d'une rfrence d'objet, qui sera reconverti en tableau dans la mthode du delegate. // La tche qui prend du temps ... private void telecharger(object object_parameters) { object[] parameters = (object[]) object_parameters; string url = (string) parameters[0]; int tentatives = (int) parameters[1]; Console.WriteLine("Dbut du tlchargement de " + url +
104
Programmation C sharp/Threads et synchronisation " ("+tentatives+" tentatives) dans le thread " + Thread.CurrentThread.GetHashCode()); //... } // Dmarre un nouveau thread pour la mthode telecharger() public void CommencerATelecharger(string url, int tentatives) { Console.WriteLine("Cration d'un thread partir du thread " + Thread.CurrentThread.GetHashCode()); Thread th = new Thread( new ParameterizedThreadStart( this.telecharger ) ); th.Start( new object[] { url, tentatives } ); }
105
Programmation C sharp/Threads et synchronisation Console.Writeline("Le thread " + th.GetHashCode() + " n'a pas termin au bout de 5 secondes, attente indfinie ..."); th.Join(); } Console.Writeline("Le thread " + th.GetHashCode() + " a termin sa tche."); }
106
Arrter un thread
L'arrt d'un thread peut tre demand en appelant la mthode Interrupt(). Cette mthode provoque le lancement d'une exception lorsque le thread appelera une mthode d'entre-sortie. Donc l'arrt du thread n'est pas instantan. Cependant l'appel cette mthode peut interrompre le thread n'importe quel moment de son excution. Il faut donc prvoir que ce genre d'exception soit lanc pour pouvoir librer les ressources dans un bloc try..finally, voire utiliser using). Une solution alternative est de tester une condition de terminaison du thread. Ceci permet de spcifier o le thread peut se terminer, et librer les ressources correctement. Exemple : public void UnThread() { // ... initialisation while ( continuer_thread ) { // ... tches du thread } // ... libration des ressources } Cependant, l'utilisation d'un bloc try..finally (ou du mot cl using) est tout de mme ncessaire au cas o le systme interromperait le thread (fin brutale de l'application par exemple).
107
ThreadState ThreadState (lecture seule) Etat actuel du thread. Cette proprit est une combinaison de valeurs de l'numration ThreadState : Running = 0x00000000 : en cours d'excution, StopRequested = 0x00000001 : arrt demand, SuspendRequested = 0x00000002 : suspension demande, Background = 0x00000004 : thread d'arrire plan, Unstarted = 0x00000008 : thread non dmarr, Stopped = 0x00000010 : thread arrt, WaitSleepJoin = 0x00000020 : thread en attente (wait, sleep, ou join), Suspended = 0x00000040 : thread suspendu, AbortRequested = 0x00000080 : abandon demand, Aborted = 0x00000100 : thread abandonn.
108
Le pool de threads
Un pool de threads est associ chaque processus. Il est compos de plusieurs threads rutilisables effectuant les tches qu'on lui assigne dans une file d'attente. Une tche est place dans la file d'attente, puis on lui affecte un thread inocup qui l'effectuera, puis le thread se remet en attente d'une autre tche. Une partie de ces threads est consacre aux oprations d'entres-sorties asynchrones. Le pool de threads est gr par les mthodes statiques de la classe ThreadPool. Par dfaut, le pool contient 25 threads par processeur. La mthode QueueUserWorkItem permet d'ajouter une nouvelle tche : bool QueueUserWorkItem ( WaitCallback callback, object state ) Le premier paramtre est un dlgu dont la signature est la suivante : delegate void WaitCallback(object state) Le second paramtre est optionnel et contient l'argument pass au dlgu. Le dlgu pass en paramtre effectuera la tche, dans le thread qui lui sera attribu.
Moniteur
Un moniteur (monitor en anglais) ne permet l'accs qu' un seul thread la fois. C'est dire que si plusieurs threads essaye d'accder au mme moniteur, un seul obtiendra l'accs, les autres tant suspendus jusqu' ce qu'ils puissent leur tour dtenir l'accs exclusif. La classe Monitor gre ce type d'objet de synchronisation. Toutes les mthodes de cette classe sont statiques. Les principales mthodes sont : void Enter(object obj) Cette mthode suspend le thread appelant si un autre thread possde dj l'accs exclusif, ou retourne immdiatement sinon. void Exit(object obj) Cette mthode met fin l'accs exclusif par le thread appelant, et permet un thread suspendu d'obtenir l'accs exclusif son tour. bool TryEnter(object obj) Cette mthode permet de tenter d'obtenir l'accs exclusif. Elle retourne true si l'accs exclusif est obtenu, false sinon. bool TryEnter(object obj,int milliseconds) Cette mthode permet de tenter d'obtenir l'accs exclusif, dans le temps imparti spcifi en millisecondes. Elle retourne true si l'accs exclusif est obtenu, false sinon.
Programmation C sharp/Threads et synchronisation L'objet pass en paramtre identifie le moniteur accd. C'est dire que tout objet peut tre utilis comme moniteur. En C#, tout est objet, mme les chanes de caractres, et les valeurs numriques et boolennes. Cependant, il n'est pas recommand d'utiliser de telles valeurs ou des rfrences publiques, car ce sont des rfrences globales. Il est prfrable d'utiliser des membres privs, voire des variables locales. Exemple : using System; using System.Threading; public class TestMonitor { private object synchro = new object(); public void MethodeThread() { int id = Thread.CurrentThread.ManagedThreadId; Console.WriteLine("Dbut du thread " + id ); Monitor.Enter( synchro ); Console.WriteLine("Le thread " + id + " entre exclusivement ..." ); Thread.Sleep(1000); // attend 1 seconde Console.WriteLine("Le thread " + id + " sort ..." ); Monitor.Exit( synchro ); Console.WriteLine("Fin du thread " + id ); } public void Test() { // 2 threads Thread thread1 = new Thread( new ThreadStart( MethodeThread ) ), thread2 = new Thread( new ThreadStart( MethodeThread ) ); thread1.Start(); thread2.Start(); } public static void Main() { new TestMonitor().Test(); } } Ce programme affiche : Dbut du thread 3 Le thread 3 entre exclusivement ... Dbut du thread 4
109
Programmation C sharp/Threads et synchronisation Le thread 3 sort ... Le thread 4 entre exclusivement ... Fin du thread 3 Le thread 4 sort ... Fin du thread 4 Ce programme ne tient pas compte des exceptions. Il faut cependant les prvoir pour s'assurer de librer le moniteur, en utilisant un bloc try..finally : ... public void MethodeThread() { int id = Thread.CurrentThread.ManagedThreadId; Console.WriteLine("Dbut du thread " + id ); Monitor.Enter( synchro ); try { Console.WriteLine("Le thread " + id + " entre exclusivement ..." ); Thread.Sleep(1000); // attend 1 seconde Console.WriteLine("Le thread " + id + " sort ..." ); } finally { Monitor.Exit( synchro ); } Console.WriteLine("Fin du thread " + id ); } ...
110
Le mot cl lock
Le mot cl lock est utilisable pour produire un code quivalent au prcdent : ... public void MethodeThread() { int id = Thread.CurrentThread.ManagedThreadId; Console.WriteLine("Dbut du thread " + id ); lock( synchro ) // <- enter ( synchro ) { Console.WriteLine("Le thread " + id + " entre exclusivement ..." ); Thread.Sleep(1000); // attend 1 seconde Console.WriteLine("Le thread " + id + " sort ..." ); } // <- exit ( synchro )
Programmation C sharp/Threads et synchronisation Console.WriteLine("Fin du thread " + id ); } ... Le mot cl lock est suivi de la rfrence de l'objet dont l'accs doit tre exclusif durant le bloc de code qui suit.
111
Programmation C sharp/Threads et synchronisation Il est possible d'appeler ces mthodes en spcifiant un temps limite (int: nombre de millisecondes ou TimeSpan) et un indicateur boolen exitContext (voir section prcdente). Les mthodes WaitAll retournent true si l'tat de tous les objets est signal, ou false sinon (temps limite expir). Les mthodes WaitAny retournent l'indice dans le tableau de l'objet dont l'tat est signal, ou la constante WaitHandle.WaitTimeout sinon (temps limite expir). Signaler et attendre Les mthodes statiques suivantes permettent de mettre l'tat signal sur un objet WaitHandle et d'attendre un autre objet WaitHandle : // Attendre que tous les objets WaitHandle soit dans l'tat signal : public static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn); public static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn, int millisecondsTimeout, bool exitContext); public static bool SignalAndWait(WaitHandle toSignal, WaitHandle toWaitOn, TimeSpan timeout, bool exitContext);
112
vnements
Un vnement est une instance de la classe EventWaitHandle (sous-classe de la classe WaitHandle vue prcdemment). Il permet de modifier son tat signal / non-signal grce aux deux mthodes suivantes : public bool Reset(); // -> tat non-signal public bool Set(); // -> tat signal Cette classe possde le constructeur suivant : public EventWaitHandle(bool initialState, EventResetMode mode); Les paramtres sont les suivants : initialState tat initial : signal (true) ou non-signal (false). mode Mode pour le retour l'tat non-signal : AutoReset ou ManualReset : ManualReset : le retour l'tat non-signal (reset) se fait explicitement en appelant la mthode Reset(). AutoReset : le retour l'tat non-signal est automatiquement effectu quand un thread est activ, c'est dire quand il a termin d'attendre l'tat signal avec une mthode wait (WaitOne, WaitAny ou WaitAll). Il y a une sous-classe pour chacun des deux modes (voir ci-dessous pour une description).
Programmation C sharp/Threads et synchronisation Synchronisation inter-processus Cette classe possde galement le constructeur suivant : public EventWaitHandle(bool initialState, EventResetMode mode, string name, ref Boolean createdNew, System.Security.AccessControl.EventWaitHandleSecurity eventSecurity); Les trois paramtres supplmentaires sont tous optionnels et sont utiliss pour le partage au niveau systme et donc pour la synchronisation entre processus : name Nom unique identifiant cette instance de la classe EventWaitHandle. createdNew Rfrence une variable boolenne que la fonction va utiliser pour indiquer si un nouvel objet EventWaitHandle a t cr (true) ou s'il existe dj (false). eventSecurity Dfinit les conditions d'accs l'objet partag. Elle possde galement une mthode statique permettant de retrouver une instance de la classe EventWaitHandle existante partage au niveau systme : public static EventWaitHandle OpenExisting(string name, System.Security.AccessControl.EventRights rights); Le paramtre rights est optionnel et permet d'accder l'objet partag. Sous-classes Cette classe a deux sous-classes : AutoResetEvent : Le retour l'tat non-signal est automatique. Une fois que l'tat signal est obtenu par un thread (fin de l'attente par une mthode wait), l'objet AutoResetEvent revient l'tat non-signal, empchant un autre thread d'obtenir l'tat signal. ManualResetEvent : Le retour l'tat non-signal se fait explicitement. Ces deux sous-classes ont un constructeur qui accepte comme paramtre un boolen initialState indiquant son tat initial : true pour l'tat signal, false pour l'tat non-signal. Exemple : using System; using System.Threading; class Exemple { static AutoResetEvent evenementTermine; static void AutreThread() { Console.WriteLine(" Autre thread : attente...");
113
0% accompli,
Programmation C sharp/Threads et synchronisation (auto) // l'tat a t signal, mais retour l'tat non-signal // maintenant que l'appel WaitOne est termin. Console.WriteLine(" attente..."); Autre thread : 50% accompli,
114
evenementTermine.WaitOne(); // Attend tat signal + Reset (auto) // l'tat a t signal, mais retour l'tat non-signal // maintenant que l'appel WaitOne est termin. Console.WriteLine(" } static void Main() { evenementTermine = new AutoResetEvent(false); Console.WriteLine("Main: dmarrage de l'autre thread..."); Thread t = new Thread(AutreThread); t.Start(); Console.WriteLine("Main: tche 1/2 : 1 seconde ..."); Thread.Sleep(1000); evenementTermine.Set(); // -> tat signal Console.WriteLine("Main: tche 2/2 : 2 secondes ..."); Thread.Sleep(2000); evenementTermine.Set(); // -> tat signal Console.WriteLine("Main: fin des tches."); } } Autre thread : 100% accompli, termin.");
Programmation C sharp/Threads et synchronisation public Mutex(bool initiallyOwned, string name, ref Boolean createdNew, System.Security.AccessControl.MutexSecurity mutexSecurity); Tous les paramtres sont optionnels : initiallyOwned : true si le mutex est dans l'tat non-signal et appartient au thread appelant, false sinon (tat signal). Les autres paramtres servent la synchronisation inter-processus et sont dcrit dans la section "Synchronisation inter-processus" prcdente. Cet objet est ddi la synchronisation inter-processus. Pour de l'exclusion mutuelle entre threads du mme processus, du point de vue des performances, il est prfrable d'utiliser un moniteur, ou l'instruction lock.
115
Programmation C sharp/Processus
Pour chaque application lance, le systme d'exploitation cre un nouveau processus grant l'tat de l'application : mmoire (variables, donnes), code en cours d'excution (threads), variables d'environnement, ressources alloues (fichiers ouverts, sockets connectes, ...). Chaque processus possde trois flux de communication : le flux d'entre (gnralement associ l'entre standard stdin ) permet au processus de recevoir des donnes de l'utilisateur, ou du processus appelant, le flux de sortie (gnralement associ la sortie standard stdout ) permet au processus d'afficher sous forme textuelle ses rsultats l'utilisateur, ou de les transmettre au processus appelant, le flux d'erreur (gnralement associ l'erreur standard stderr ) permet au processus de notifier les messages erreurs l'utilisateur, ou au processus appelant.
Programmation C sharp/Entres-sorties
116
Programmation C sharp/Entres-sorties
Les fonctions d'entres-sorties utilisent l'espace de nom System.IO.
La classe Stream
La classe abstraite Stream possde des mthodes permettant la fois de lire et d'crire. Cependant, l'criture ou la lecture peut ne pas tre autorise (fichier en lecture seule, ...).
Proprits
La classe Stream possde les proprits suivantes : bool CanRead (lecture seule) Cette proprit vaut true quand la lecture est possible. bool CanWrite (lecture seule) Cette proprit vaut true quand l'criture est possible. bool CanSeek (lecture seule) Cette proprit vaut true quand le positionnement dans le flux est possible (mthode Seek ou proprit Position). bool CanTimeout (lecture seule) Cette proprit vaut true quand le flux peut expirer (fin de connexion pour une socket, ...). long Length (lecture seule) Longueur du flux en nombre d'octets. long Position Position courante dans le flux en nombre d'octets depuis le dbut. int ReadTimeout Temps imparti pour la mthode Read, en millisecondes. L'accs cette proprit peut dclencher le lancement d'une exception de type InvalidOperationException si la fonctionnalit n'est pas supporte. int WriteTimeout Temps imparti pour la mthode Write, en millisecondes. L'accs cette proprit peut dclencher le lancement d'une exception de type InvalidOperationException si la fonctionnalit n'est pas supporte.
Mthodes
Les mthodes de la classe Stream sont les suivantes : void Close() Ferme le flux. void Dispose() Libre les ressources occupes par le flux. void Flush() Cette mthode vide les buffers d'criture vers le support associ (fichier, socket, ...). int ReadByte() Cette mthode lit un octet et retourne sa valeur, ou -1 en cas d'erreur.
Programmation C sharp/Entres-sorties void WriteByte(byte value) Cette mthode crit un octet. int Read(byte[] buffer, int offset, int count) Cette mthode lit count octets dans le buffer spcifi, partir de l'offset offset dans le tableau buffer. Elle retourne le nombre d'octets effectivement lus. void Write(byte[] buffer, int offset, int count) Cette mthode crit count octets du tableau buffer dont le premier octet est situ l'offset offset. void Seek(long offset, SeekOrigin origin) Dplace le pointeur d'criture/lecture de offset octets depuis l'origine indique: SeekOrigin.Begin : depuis le dbut du flux, SeekOrigin.End : partir de la fin du flux, SeekOrigin.Current : partir de la position courante dans le flux. void SetLength(long value) Cette mthode modifie la longueur totale du flux (troncature ou remplissage avec des octets nuls).
117
Mthodes asynchrones
Les mthodes Read et Write utilisant un tableau d'octet existent galement en version asynchrone : IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback, object). int EndRead(IAsyncResult result). IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback, object). void EndWrite(IAsyncResult result).
Membres statiques
La classe Stream possde galement deux membres statiques : La constante Null est un flux dont la lecture ou l'criture ne produit aucun effet. La mthode statique Synchronized retourne une version synchronise du flux pass en paramtre.
Fonctions asynchrones
Les fonctions dont le retour peut prendre du temps existent galement en version asynchrone. La mthode appele est alors celle dont le nom commence par Begin. Elle demande au pool de threads standard d'excuter l'opration. Une fois l'opration termine, le delegate pass la fonction Begin doit appeler la fonction End correspondante pour rcuprer le rsultat.
Exemple
Cet exemple utilise la version asynchrone de la mthode Read de la classe Stream. class LectureAsync { private byte[] buffer = new byte[4000]; public void commencerLecture(Stream s) {
Programmation C sharp/Entres-sorties // Commencer la lecture IAsyncResult iar = s.BeginRead(buffer, 0, buffer.length, finLecture, s); // et retour immmdiat // La mthode finLecture transmise en 4me paramtre sera appele // quand la lecture du tableau d'octets sera termine. } public void finLecture(IAsyncResult result) //AsyncCallback { // Stream : le dernier argument transmis BeginRead Stream s=(Stream)result.AsyncState; // rcuprer le nombre d'octets lus int nb_octets = s.EndRead(result); } }
118
Flux de fichier
La classe FileStream drive de la classe Stream. Elle possde donc les mmes mthodes. La classe FileStream possde les constructeurs suivants : public FileStream(string path, System.IO.FileMode mode, [ System.IO.FileAccess access, [ System.IO.FileShare share, [ int bufferSize, [ System.IO.FileOptions options ] ] ] ] ); public FileStream(string path, System.IO.FileMode mode, [ System.IO.FileAccess access, [ System.IO.FileShare share, [ int bufferSize, [ bool useAsync ] ] ] ] ); public FileStream(string path, System.IO.FileMode mode, System.Security.AccessControl.FileSystemRights rights, System.IO.FileShare share, int bufferSize, System.IO.FileOptions options, [ System.Security.AccessControl.FileSecurity fileSecurity ] ); Les crochets indiquent les paramtres optionnels.
119
Attributs
L'attribut System.SerializableAttribute marque les classes dont les instances peuvent tre srialises. Si l'attribut est absent pour une classe, la srialisation de ses instances provoquera une exception. Exemple : [Serializable] class Facture { public string Client; public double TotalHT; public double TotalTTC; } L'attribut System.NonSerializedAttribute marque les champs qu'il ne faut pas enregistrer. C'est le cas des champs dont on peut retrouver la valeur par calcul, par exemple. Exemple : [Serializable] class Facture { public string Client; public double TotalHT; [NonSerialized] public double TotalTTC; // = TotalHT * (1 + taux_TVA/100) } Quand la classe volue, de nouveaux champs sont ajouts la classe, d'autres sont retirs. L'attribut System.Runtime.Serialization.OptionalFieldAttribute marque les champs optionnels lors de la dsrialisation (lecture de l'objet). Il est donc possible de marquer les nouveaux champs comme optionnels, et garder les anciens champs (marqus optionnels galement) pour garder la compatibilit avec les anciens fichiers. Exemple : [Serializable] class Facture { public string Client; public double TotalHT; [NonSerialized]
Programmation C sharp/La srialisation public double TotalTTC; [OptionalField] public string AdresseLivraison; // Nouveau champ } Dans cet exemple, la classe Facture permettra de lire des fichiers d'objets Facture contenant le champ AdresseLivraison ou non.
120
La srialisation
Le format de srialisation dpend de la classe utilise pour srialiser les objets.
La classe System.Runtime.Serialization.Formatter
Cette classe abstraite dfinit les mthodes suivantes : void Serialize( System.IO.Stream serializationStream, object graph); Cette mthode enregistre l'objet graph dans le flux d'entre-sortie spcifi. object Deserialize( System.IO.Stream serializationStream); Cette mthode retourne l'objet lu depuis le flux d'entre-sortie spcifi. Les classes drives dfinissent un format concret de srialisation : La classe System.Runtime.Serialization.Formatters.Binary.BinaryFormatter permet de srialiser dans un format binaire, La classe System.Runtime.Serialization.Formatters.Soap.SoapFormatter permet de srialiser au format SOAP. Une classe drive de System.Runtime.Serialization.Formatter srialise les attributs et les vnements d'un objet, quel que soit l'accs associ (public, protg, priv, ou par dfaut).
Format XML
La classe System.Xml.Serialization.XmlSerializer permet de srialiser au format XML. Elle ne drive pas de la classe System.Runtime.Serialization.Formatter, et possde les mthodes suivantes : void Serialize( System.IO.Stream stream, object o); void Serialize( System.IO.TextWriter textWriter, object o); void Serialize( System.Xml.XmlWriter xmlWriter, object o); Ces mthodes enregistrent l'objet graph dans le flux d'entre-sortie spcifi. object Deserialize( System.IO.Stream stream);
Programmation C sharp/La srialisation object Deserialize( System.IO.TextReader textReader); object Deserialize( System.Xml.XmlReader xmlReader); Ces mthodes retournent l'objet lu depuis le flux d'entre-sortie spcifi. Pour le format XML, les attributs Serializable et NonSerialized sont ignors : Toute classe est srialisable en XML, L'attribut System.Xml.Serialization.XmlIgnoreAttribute marque les champs ignorer lors de la srialisation. La classe System.Xml.Serialization.XmlSerializer srialise les attributs et les proprits en lecture/criture publics d'un objet, si la valeur n'est pas nulle. Donc la srialisation en XML ignore : les attributs et proprits retournant une valeur nulle, les attributs et proprits protgs ou privs, les proprits en lecture seule (impossible de les dsrialiser), les proprits en criture seule (impossible de les srialiser).
121
Pour en savoir plus : (en) XML Serialization in the .NET Framework [1]
Srialisation personnalise
Il est possible de personnaliser la manire de srialiser System.Runtime.Serialization.ISerializable. Cette interface n'a qu'une mthode, invoque lors de la srialisation : void GetObjectData ( SerializationInfo info, StreamingContext context ) Mais la classe doit galement comporter le constructeur suivant, invoqu lors de la dsrialisation : protected NomDeClasse(SerializationInfo info, StreamingContext context) L'objet de type SerializationInfo permet la srialisation et la dsrialisation de l'objet. Chaque valeur sauvegarde est associ un nom unique. Cet objet possde les mthodes suivantes : public void AddValue(string name, T value) // tout type de valeur public void GetValue(string name, Type type) public void GetType(string name) L'implmentation de la mthode GetObjectData fait appel la mthode AddValue de l'objet info pour ajouter une valeur sauvegarder. Le constructeur utilise la mthode GetValue ou les mthodes GetType pour retrouver la valeur sauvegarde. Exemple : [Serializable] public class Personne : ISerializable { private string nom; private int age; un objet en implmentant l'interface
122
public Personne() { } protected Personne(SerializationInfo info, StreamingContext context) { if (info == null) throw new System.ArgumentNullException("info"); nom = (string)info.GetValue("Nom", typeof(string)); age = (int)info.GetValue("Age", typeof(int)); } public virtual void GetObjectData(SerializationInfo info, StreamingContext context) { if (info == null) throw new System.ArgumentNullException("info"); info.AddValue("Nom", nom); info.AddValue("Age", age); } }
Rfrences
[1] http:/ / msdn2. microsoft. com/ en-us/ library/ ms950721. aspx
123
Copier un fichier
La mthode Copy de la classe File permet de copier le contenu d'un fichier dans un autre : public static void Copy(string sourceFileName, string destFileName[, bool overwrite]); Le paramtre overwrite de type boolen indique si le fichier destination doit tre cras s'il existe dj.
124
Suppression
La mthode Delete permet de supprimer un fichier ou un rpertoire : public static void Delete(string path);
Informations
Les mthodes suivantes donnent ou modifient les informations sur le fichier ou le rpertoire donn en paramtre. Dates public static DateTime GetCreationTime(string path); public static DateTime GetCreationTimeUtc(string path); Ces mthodes retournent respectivement : la date et l'heure de cration (heure locale) la date et l'heure de cration (UTC) public static DateTime GetLastAccessTime(string path); public static DateTime GetLastAccessTimeUtc(string path); Ces mthodes retournent respectivement : la date et l'heure du dernier accs (heure locale) la date et l'heure du dernier accs (UTC) public static DateTime GetLastWriteTime(string path); public static DateTime GetLastWriteTimeUtc(string path); Ces mthodes retournent respectivement : la date et l'heure de modification (heure locale) la date et l'heure de modification (UTC) public static void SetCreationTime(string path, DateTime creationTime); public static void SetCreationTimeUtc(string path, DateTime creationTimeUtc); Ces mthodes modifient respectivement : la date et l'heure de cration (heure locale) la date et l'heure de cration (UTC)
public static void SetLastAccessTime(string path, DateTime lastAccessTime); public static void SetLastAccessTimeUtc(string path, DateTime lastAccessTimeUtc);
Ces mthodes modifient respectivement : la date et l'heure du dernier accs (heure locale) la date et l'heure du dernier accs (UTC) public static void SetLastWriteTime(string path, DateTime lastWriteTime); public static void SetLastWriteTimeUtc(string path, DateTime lastWriteTimeUtc); Ces mthodes modifient respectivement : la date et l'heure de modification (heure locale) la date et l'heure de modification (UTC)
Programmation C sharp/Les fichiers Contrle d'accs // classe File public static FileSecurity GetAccessControl(string path, [ AccessControlSections includeSections ] ); Cette mthode retourne les informations de scurit d'un fichier. // classe Directory public static DirectorySecurity GetAccessControl(string path, [ AccessControlSections includeSections ] ); Cette mthode retourne les informations de scurit d'un rpertoire. // classe File public static void SetAccessControl(string path, FileSecurity fileSecurity); Cette mthode modifie les informations de scurit d'un fichier. // classe Directory public static void SetAccessControl(string path, DirectorySecurity directorySecurity); Cette mthode modifie les informations de scurit d'un rpertoire. Les classes FileSecurity, DirectorySecurity et AccessControlSections sont dfinies dans l'espace de nom System.Security.AccessControl. Attributs d'un fichier La classe File possde deux mthodes pour la gestion des attributs de fichiers : public static FileAttributes GetAttributes(string path); Cette mthode retourne les attributs du fichier. public static void SetAttributes(string path, FileAttributes fileAttributes); Cette mthode modifie les attributs du fichier. L'numration FileAttributes contient les lments suivants : Directory : le chemin dsigne un rpertoire. Normal : le fichier est normal. Archive : le fichier peut tre archiv. Hidden : le fichier est cach. ReadOnly : le fichier est en lecture seule. System : le fichier est un fichier systme. Compressed : le fichier est compress (NTFS). Encrypted : le fichier est crypt (NTFS). Device NotContentIndexed Offline
125
Programmation C sharp/Les fichiers Rpertoire courant Les deux mthodes suivants sont dfinies dans la classe Directory. Le rpertoire courant dsigne le rpertoire partir duquel sont dfinis les fichiers et rpertoires dsigns par un chemin relatif. public static string GetCurrentDirectory(); Cette mthode retourne le chemin du rpertoire courant de l'application. public static void SetCurrentDirectory(string path); Cette mthode dfini le chemin du nouveau rpertoire courant de l'application.
126
Proprits
Les deux classes ont les proprits communes suivantes : // Nom public public public et extension : string Name { virtual get; } string Extension { get; } string FullName { virtual get; }
// Test d'existence, et attributs public bool Exists { virtual get; } public FileAttributes Attributes { get; set; } // Dates et heures (cration, accs et criture), locales et UTC : public DateTime CreationTime { get; set; } public DateTime CreationTimeUtc { get; set; } public DateTime LastAccessTime { get; set; } public DateTime LastAccessTimeUtc { get; set; } public DateTime LastWriteTime { get; set; } public DateTime LastWriteTimeUtc { get; set; } La classe FileInfo a les proprits spcifiques suivantes :
Programmation C sharp/Les fichiers // Test lecture seule et taille du fichier (octets) : public bool IsReadOnly { get; set; } public long Length { get; } // Rpertoire parent (objet, chemin) : public DirectoryInfo Directory { get; } public string DirectoryName { get; } La classe DirectoryInfo a les proprits spcifiques suivantes : // Rpertoires parent et racine : public DirectoryInfo Parent { get; } public DirectoryInfo Root { get; }
127
Utilisation de sockets
L'espace de noms System.Net.Sockets possde une classe Socket qui est une abstraction de bas niveau d'une socket en gnral. Les classes TcpClient et TcpListener grent une socket utilisant le protocole TCP. La classe UdpClient gre une socket utilisant le protocole UDP.
128
Serveur Remoting
l'aide de la librairie System.Runtime.Remoting placer dans l'application servante et cliente, celles-ci peuvent partager une classe par Marshaling suivant un canal Http, Ipc ou Tcp. Le remoting utilise les changes RPC. Dans cette solution : 1. INTERFACE : IRemoteMath est une librairie de classe 2. SERVER : RemoteServer est une application console 3. CLIENT : RemoteClient est une application console
L'interface partage
Une interface IOperations comprenant un prototype d'addition. namespace IRemoteMath { public interface IOperations { int Addition(int a, int b); } }
Le serveur
Le serveur est l'application qui distribue ses services. Pour qu'elle dserve distance, il lui faut : Dans ses rfrences : 1. System.Runtime.Remoting 2. Le namespace d'IRemoteMath Implmenter IOperations Implmenter IOperations La classe servir doit faire partie du service distributeur ici RemoteServer namespace RemoteServer { public class RemoteOperations : MarshalByRefObject, IRemoteMath.IOperations { // l'objet aura une dure de vie illimite public override object InitializeLifetimeService() { return null; }
Programmation C sharp/Excution distante // cette mthode sera servie public int Addition(int a, int b) { Console.WriteLine(String.Format("> Addition() : a={0}, b={1}", a, b)); return a + b; } } } MarshalByRefObject signifie que RemoteOperations fera l'objet d'un marshaling. Configurer RemoteMain Pour couter les appels, le serveur doit crer un canal d'coute sur un port et enregistrer le service distribuer. using using using using System; System.Runtime.Remoting; System.Runtime.Remoting.Channels; System.Runtime.Remoting.Channels.Tcp;
129
namespace RemoteServer { class RemoteMain { [STAThread] static void Main(string[] args) { try { // Cration du canal sur le port 1050 TcpChannel channel = new TcpChannel(1050); // Enregistrement du canal ChannelServices.RegisterChannel(channel); // Distribution de l'objet en mode singleton RemotingConfiguration.RegisterWellKnownServiceType( typeof(RemoteOperations), "RemoteOperations", WellKnownObjectMode.Singleton); Console.WriteLine("Serveur dmarr"); Console.ReadLine(); } catch { Console.WriteLine("Erreur au dmarrage"); Console.ReadLine(); } }
Programmation C sharp/Excution distante } } 1. [STAThread] au point d'entre instruit le main comme "appartement" pour cloisonner les traitements au partage de ses ressources. 2. RemotingConfiguration.RegisterWellKnownServiceType enregistre RemoteOperations dans ses services 3. Le canal est ici en TCP
130
Le client
Le client appelle les services. Pour qu'elle soit servie, il lui faut : Dans ses rfrences : 1. System.Runtime.Remoting 2. Le namespace d'IRemoteMath using System; using System.Text; // Remoting using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; namespace RemoteClient { class RemoteTestClient { // prparation de l'objet distribu private IRemoteMath.IOperations remoteOperation; public RemoteTestClient() { try { // init channel - facultatif // TcpChannel channel = new TcpChannel(); // ChannelServices.RegisterChannel(channel); // init IOperations < RemoteServer.RemoteOperations this.remoteOperation = (IRemoteMath.IOperations)Activator.GetObject( typeof(IRemoteMath.IOperations), "tcp://localhost:1050/RemoteOperations"); } catch { Console.WriteLine("Erreur de connexion"); } } public void RemoteAddition(int a, int b)
Programmation C sharp/Excution distante { try { if (this.remoteOperation != null) { Console.WriteLine("Rsultat : " + this.remoteOperation.Addition(a, b).ToString()); } } catch { Console.WriteLine("Erreur l'appel"); } } [STAThread] static void Main() { RemoteTestClient Client = new RemoteTestClient(); Client.RemoteAddition(15, 20); System.Threading.Thread.Sleep(5000); } } } 1. [STAThread] indique qu'on est dans le mme type de cloisonnement des threads que pour server. 2. remoteOperation dpile la classe reu par TCP permettant l'utilisation de ses proprits.
131
Application
1. Pour effectuer le test, il faut compiler les trois projets IRemoteMath,RemoteServer,RemoteClient 2. Executer RemoteServer.exe avant RemoteClient.exe Le rsultat du client devrait tre : Rsultat : 35 Le message du serveur devrait tre : > Addition() : a=15, b=20
132
Ressources
Programmation C sharp/Bibliographie et liens
Liens internes
Programmation .Net
Liens externes
(fr) La documentation MSDN de Visual C# [1] (fr) Centre de Dveloppement C# - Site MSDN [2] (fr) Guide de programmation C# [3] (fr) Un blog sur .Net [4] (en) C# Language Specification 4th edition [5] (en) Encyclopdie collaborative sur C# et .Net [6] (en) Page du standard ISO [7] (en) Page du standard ECMA [8] (en) C# Help : aide aux dveloppeurs [9] (en) Vidos d'apprentissage de C#, Visual Studio express, et .Net [10] (en) Vidos d'apprentissage de C#, Visual Studio, et .Net [11]
Livres
(fr) Pierre-Yves Saumont, Antoine Mirecourt-Introduction C#-ditions Eyrolles-2001-292 pages-ISBN 2-7464-0301-3 (fr) Grard Leblanc-C# et .NET-ditions Eyrolles-2002-710 pages-ISBN 2-212-11066-9 (fr) Grard Leblanc-C# et .NET Version 2-ditions Eyrolles-2006-ISBN 2-212-11778-7 (fr) Donis Marshall, Christine Eberhardt, Philippe Beaudran, Dorothe Sittler-Visual C# 2005-Collection Microsoft Press,ditions Dunod-2006-ISBN 2-10-049942-4 (fr) Mickey Williams-Manuel de rfrence Microsoft Visual C#-Collection Langages et Programmation,ditions Dunod-2002-784 pages-ISBN 2-10-006659-5 (fr) Tom Archer-Formation C#-Collection Formation ...,ditions Dunod-2001-400 pages-ISBN 2-84082-864-2 (en) Adrian Kingsley-Hughes, Kathie Kingsley-Hughes-C# 2005 Programmer's Reference-ditions Wrox-2006-ISBN 0-470-04641-4 (en) Simon Robinson, Christian Nagel, Karli Watson, Jay Glynn, Morgan Skinner, Bill Evjen-Professional C# (3medition)-ditions Wrox-2004-ISBN 0-7645-5759-9 (en) Ben Albahari, Peter Drayton, Brad Merrill-C# Essentials (2medition)-ditions O'Reilly Media-2002-ISBN 0-5960-0315-3 (en) Andrew Krowczyk, Zach Greenvoss, Christian Nagel, Ashish Banerjee, Thiru Thangarathinam, Aravind Corera, Chris Peiris, Brad Maiani-Professional C# Web Services: Building .NET Web Services with ASP.NET and .NET Remoting-ditions Wrox Press-2001-550 pages-ISBN 1-8610-0439-7 (en) Matthew MacDonald-Pro .NET 2.0 Windows Forms and Custom Controls in C#-ditions Apress-2005-1080 pages-ISBN 1-59059-439-8
133
Rfrences
[1] http:/ / msdn2. microsoft. com/ fr-fr/ library/ kx37x362. aspx [2] http:/ / msdn. microsoft. com/ fr-fr/ vcsharp/ default. aspx [3] http:/ / msdn2. microsoft. com/ fr-fr/ library/ 67ef8sbd(VS. 80). aspx [4] http:/ / www. labo-dotnet. com/ [5] http:/ / www. ecma-international. org/ publications/ files/ ECMA-ST/ Ecma-334. pdf [6] http:/ / en. csharp-online. net/ [7] http:/ / www. iso. org/ iso/ en/ CatalogueDetailPage. CatalogueDetail?CSNUMBER=36768 [8] http:/ / www. ecma-international. org/ publications/ standards/ Ecma-334. htm [9] http:/ / www. csharphelp. com [10] http:/ / msdn. microsoft. com/ vstudio/ express/ visualcsharp/ learning/ [11] http:/ / www. learnvisualstudio. net
A
abstract add alias as
F
false finally fixed float for foreach
O
object operator out override
T
this throw true try typeof
B
base bool break byte
P
params partial private protected public
G
get global goto
U
uint ulong unchecked unsafe ushort using
C
case catch char checked class const continue
I
if implicit in int interface internal is
R
readonly ref remove return
V
value virtual void
W
where while
L
lock long
Y
yield
134
E
else enum event explicit extern
S
namespace new null sbyte sealed set short sizeof stackalloc static string struct switch
abstract
Ce mot-cl permet de dclarer une classe ou une mthode abstraite (voir classe abstraite).
add
Accesseur d'ajout d'une mthode un event (voir fonctionnement interne d'un event).
alias
Alias d'assemblage pour crer de nouvelles racines d'espace de nom (voir Alias d'assemblages).
as
Oprateur de conversion (voir l'oprateur as).
base
Rfrence la classe de base (voir hritage de classes).
bool
Le type boolen (voir Les types de bases).
break
Interruption de l'excution d'une boucle ou d'un test de cas (voir les structures de contrle).
byte
Le type octet (8 bits) non sign (voir Les types de bases).
case
Dclaration d'un cas tester (voir tests de plusieurs cas, default, switch).
catch
Dbut du bloc excut quand une exception est attrape (voir attraper une exception).
135
char
Le type caractre unicode (16 bits) (voir Les types de bases).
checked
valuation de l'expression donne dans un contexte vrifiant le dbordement, et lanant une exception de type System.OverflowException dans ce cas (voir Vrification du dbordement et unchecked).
class
Dclaration d'une nouvelle classe d'objets (voir les classes).
const
Dclaration d'une constante (voir Les constantes).
continue
Poursuite immdiate de l'excution d'une boucle sans excuter la fin du bloc d'instruction (voir continuer une boucle).
decimal
Le type nombre dcimal virgule flottante, grande prcision (voir Les types de bases).
default
Dclaration du cas par dfaut (voir tests de plusieurs cas, case, switch), Obtenir la valeur par dfaut d'un type (voir Types de base : Valeur par dfaut, Types gnriques : Oprateur default).
delegate
Dclaration d'une rfrence une mthode de signature spcifique (voir Les dlgus).
136
do
Cette instruction permet d'excuter plusieurs fois une instruction (voir les boucles, while).
double
Le type nombre virgule flottante, double prcision (voir Les types de bases).
else
Cette instruction prcde l'instruction excuter quand la condition est fausse (voir condition).
enum
Dclaration d'une nouvelle numration (voir les numrations).
event
Dclaration d'une rfrence de mthode pour la gestion d'vnements (voir Les vnements).
explicit
Dclarer un oprateur de conversion explicite (voir Explicite/Implicite, implicit).
extern
Dclarer une fonction dfinie dans une DLL (voir Appel de plateforme).
false
Faux. L'une des deux valeurs possibles pour le type boolen (voir Les types de bases, true).
finally
Dbut du bloc de code excut la fin d'un bloc try, quel que soit les exceptions ventuellement lances (voir attraper une exception).
fixed
viter le dplacement en mmoire d'un tableau ou d'un objet par le ramasse-miettes (voir viter le dplacement par le ramasse-miettes).
float
Le type nombre virgule flottante, simple prcision (voir Les types de bases).
for
Cette instruction permet d'excuter plusieurs fois une instruction (voir les boucles).
foreach
Programmation C sharp/Index des mots-cls du langage Cette instruction permet d'excuter une instruction pour chacun des lments d'un ensemble : tableau, liste, ... (voir les boucles, in).
137
get
Accesseur de lecture d'une proprit ou d'un indexeur (voir proprits et indexeurs).
global
Racine par dfaut des espaces de nom (voir Conflit de nom).
goto
Cette instruction poursuit l'excution au cas indiqu (voir tests de plusieurs cas, switch).
if
Cette instruction permet d'excuter une instruction si une condition est vraie (voir condition).
implicit
Dclarer un oprateur de conversion implicite (voir Explicite/Implicite, explicit).
in
Cette instruction permet de spcifier l'ensemble d'lments (tableau, liste, ...) pour lequel une instruction sera excute pour chacun des lments (voir les boucles, foreach).
int
Le type entier sign sur 32 bits (voir Les types de bases).
interface
Dclaration d'une nouvelle interface (voir les interfaces).
internal
Niveau de protection d'un membre de classe : accs possible au sein du mme assemblage seulement (voir Niveaux de protection).
138
is
Test du type d'un objet (voir L'oprateur is).
lock
Outil de synchronisation entre threads permettant un accs exclusif un objet pendant l'excution du bloc de code associ (voir Synchonisation avec le mot cl lock).
long
Le type entier sign sur 64 bits (voir Les types de bases).
namespace
Dclaration d'un espace de nom (voir les espaces de noms).
new
Cration d'une nouvelle instance de classe (voir Instance d'une classe). Surcharge d'une mthode sans polymorphisme (voir Surcharge sans polymorphisme).
null
Rfrence nulle (voir La rfrence nulle).
object
Type d'objet la base de tous les autres types (voir Les objets).
operator
Mot cl prcdant l'oprateur surcharg dans une dclaration de mthode (voir Surcharge des oprateurs).
out
Mode de passage de paramtre une mthode de type criture seule. Un tel paramtre doit obligatoirement tre modifi par la mthode appele, et n'a pas besoin d'tre initialis avant l'appel la mthode (voir Paramtre out, ref).
override
Surcharge d'une mthode avec polymorphisme (voir Surcharge avec polymorphisme, virtual).
params
Prcde la dclaration du dernier paramtre d'une mthode (de type tableau) pour que celui-ci recueille tous les paramtres supplmentaires sous la forme d'un tableau (voir Nombre variable de paramtres).
139
partial
Ce mot cl indique que le fichier source ne contient qu'une partie de la classe, la structure ou l'interface dclare. (Voit type partiel).
private
Niveau de protection d'un membre de classe le plus restrictif : accs possible au sein de la classe seulement (voir Niveaux de protection).
protected
Niveau de protection d'un membre de classe : accs possible au sein de la classe ou de ses sous-classes, quelquesoit le niveau d'hritage (voir Niveaux de protection et Hritage).
public
Niveau de protection d'un membre de classe le moins restrictif : accs possible depuis n'importe quelle classe (voir Niveaux de protection).
readonly
Dclaration d'une variable en lecture seule, c'est dire dont l'affectation ne peut s'effectuer qu'une seule fois (voir Variable en lecture seule).
ref
Mode de passage de paramtre une mthode de type lecture et criture (rfrence). Un tel paramtre peut tre modifi par la mthode appele, et doit tre initialis avant l'appel la mthode (voir Paramtre out, out).
remove
Accesseur de retrait de mthode d'un event (voir fonctionnement interne d'un event).
return
Cette instruction spcifie ce que la fonction retourne (voir les fonctions).
sbyte
Le type octet (8 bits) sign (voir Les types de bases).
sealed
Une classe dclare "Sealed" ne peut plus tre hrite (voir Classe sans hritire).
set
Accesseur de modification d'une proprit ou d'un indexeur (voir proprits et indexeurs).
140
short
Le type entier sign sur 16 bits (voir Les types de bases).
sizeof
Obtenir la taille du type ou de la variable spcifie entre parenthses. Le code utilisant cet oprateur doit tre dclar comme non vrifi (voir Taille d'une variable ou d'un type, unsafe).
stackalloc
Allocation sur la pile au lieu du tas. Ce mot-cl doit tre utilis dans un contexte de code non vrifi (voir Allocation sur la pile, unsafe).
static
Dclaration d'un membre statique d'une classe, ou d'une classe statique ne contenant que des membres statiques (voir Membres statiques de classe et membres d'instance).
string
Le type chane de caractres (voir Les types de bases).
struct
Dclaration d'une nouvelle structure de donnes (voir les structures).
switch
Cette instruction permet de tester la valeur d'une expression avec plusieurs cas (voir tests de plusieurs cas, case, default).
this
Rfrence l'objet lui-mme (voir hritage de classes).
throw
Cette instruction lance un exception (voir lancer une exception).
true
Vrai. L'une des deux valeurs possibles pour le type boolen (voir Les types de bases, false).
try
Dbut du bloc de code pour lequel les exceptions sont attrapes (voir attraper une exception).
typeof
Rcuprer le type (System.Type) de la classe dont le nom est spcifi entre parenthses (voir Types de base : Obtenir le type).
141
uint
Le type entier non sign sur 32 bits (voir Les types de bases).
ulong
Le type entier non sign sur 64 bits (voir Les types de bases).
unchecked
valuation de l'expression donne dans un contexte ne vrifiant pas le dbordement, et copiant le rsultat mme si celui-ci ne loge pas dans le type requis (voir Non vrification du dbordement, checked).
unsafe
Dclarer du code non vrifi (voir Code non vrifi).
ushort
Le type entier non sign sur 16 bits (voir Les types de bases).
using
Dclaration des espaces de nom utiliss (voir Utiliser les membres d'un espace de nom), Cration d'un alias d'espace de nom (voir Alias d'espace de nom), ou de classe gnrique (voir Alias de type gnrique), Utilisation d'un objet IDisposable (voir Librer des ressources).
value
Nom rserv au paramtre des accesseurs add, remove et set.
virtual
Dclaration d'une mthode dont la surcharge est avec polymorphisme (voir Surcharge avec polymorphisme, override).
void
Le type vide pour indiquer qu'une fonction ne retourne rien (voir Les fonctions).
where
Contraintes sur un type gnrique (voir Contraintes sur les types gnriques).
while
Cette instruction permet d'excuter plusieurs fois une instruction tant qu'une condition est vraie (voir les boucles, do).
142
yield
Cette instruction permet de crer une numration (voir l'interface IEnumerable et le mot cl yield).
143
144
Licence
145
Licence
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/