Académique Documents
Professionnel Documents
Culture Documents
Le langage
1 Les variables
1.1 Dclaration
1.2 Utilisation
2 Les constantes
2.1 Dclaration
[modifier]Les
variables
Une variable rserve une place en mmoire pour stocker des donnes : rsultats d'expressions,
donnes lues depuis un fichier, ... Elle est associe un nom.
[modifier]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 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 :
La dure de vie d'une variable est la priode durant laquelle une variable existe, c'est dire conserve
son emplacement en mmoire et durant laquelle elle peut donc stocker des donnes.
[modifier]Variable
en lecture seule
Une variable peut tre dclare en lecture seule en utilisant le mot-cl readonly.
Exemple :
readonly double taux_tva = 19.6;
Il n'est pas obligatoire d'initialiser une variable en lecture seule lors de sa dclaration. Ce qui permet
de dterminer la valeur en fonction d'autres donnes, ou de lire sa valeur depuis un fichier par
exemple, et d'empcher sa modification aprs affectation.
Exemple :
class Facture
{
public readonly double taux_tva;
public Facture(bool taux1)
{
if (taux1) taux_tva = 19.6;
else taux_tva = 5.5;
}
}
[modifier]Les
constantes
Une constante nomme est associe une valeur pour toute la dure de l'application. Sa valeur ne
peut changer.
[modifier]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 :
des constantes
Le mot const ne s'applique qu'aux types standards numriques, boolens, string, et numrations.
[modifier]Porte
Les mmes rgles que celles pour les variables s'appliquent galement aux constantes.
Les types valeurs qui stockent directement la valeur des donnes (un entier, une chane de
caractres, une structure),
Les types rfrences qui stockent une rfrence vers la valeur des donnes (un tableau, un objet,
une interface). Les variables de ce type se distinguent par le fait qu'elles valent
initialement null et qu'il faut explicitement leur allouer de l'espace mmoire avec new. Les
donnes rfrences par ces variables sont donc soumises au garbage collector quand plus
aucune rfrence n'existe, afin de librer la place mmoire occupe.
3 Auto-boxing/unboxing
4 Types nullable
6 Obtenir le type
[modifier]Liste
Type
Description
Exemples
bool
System.Bool
char
System.Char
'A'
sbyte
System.SByte
-128
byte
System.Byte
255
short
System.Int16
-129
ushort
System.UInt16
1450
int
System.Int32
-100000
uint
System.UInt32
8000000
long
System.Int64
-2565018947302L
ulong
System.UInt64
8000000000000L
float
System.Single
3.14F
3.14159
3.1415926M
string
"Exemple"
"C:\\windows\\system32"
@"C:\windows\system32"
System.String
[modifier]Syntaxe
Chane de caractres
Comme illustr par l'exemple du tableau ci-dessus, une chane de caractres peut avoir deux
syntaxes diffrentes :
Syntaxe avec caractres d'chappement : La chane est entoure par les guillemets et l'anti-slash
introduit un caractre spcial (\n, \t ...) ou empche son interprtation (guillemet \" et antislash \\)
Syntaxe verbatim : La chane est prcde d'un caractre arobase, et l'anti-slash n'est pas
interprt. Si un guillemet doit faire partie de la chane de caractre, il faut le doubler "".
Exemples :
"un guillemet \", un anti-slash \\, un retour la ligne\n"
@"un guillemet "", un anti-slash \, un retour la ligne
"
La syntaxe verbatim simplifie la frappe des chemins de fichiers qui utilisent le caractre anti-slash
comme sparateur :
@"C:\program files\monapp\monfichier.txt"
[modifier]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;
[modifier]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 :
Console.WriteLine("Numro : "+( numero??50 ));
[modifier]Valeur
par dfaut
L'oprateur default retourne la valeur par dfaut du type 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 int absolu(int? valeur)
{
if (valeur==null) return default(int);
else return (valeur<0) ? -valeur : valeur;
}
L'utilit de cet oprateur est plus vident avec l'utilisation de types gnriques.
[modifier]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.
Les tableaux
Un tableau regroupe plusieurs donnes du mme type dans un ensemble ordonn, index par un
entier. En C#, comme avec la plupart des langages de programmation modernes, le premier lment
porte l'index 0.
Sections
[masquer]
3 Pr-initialisation
6 Tableaux multi-dimensionnels
[modifier]Dclaration
d'un tableau
Les crochets ajouts la fin d'un type indique qu'il s'agit d'un tableau.
Exemple :
int[] entiers;
La variable entiers est un tableau de nombres entiers. Le nombre d'lments du tableau n'est pas
spcifi la dclaration, mais lors de l'allocation du tableau.
[modifier]Allocation
d'un tableau
Les tableaux font partie des types rfrences. Il n'est donc pas allou par dfaut (rfrence null).
L'allocation se fait en utilisant le mot cl new :
new type[taille]
Exemple :
int[] entiers = new int[10]; // un tableau de 10 entiers
Il est galement possible de l'allouer ailleurs que dans la dclaration :
int[] entiers;
...
entiers = new int[10]; // un tableau de 10 entiers
Une fois la place du tableau rserve en mmoire, celui-ci ne contient que des valeurs par dfaut,
c'est dire que chaque lment d'un tableau de numriques (entiers, rels, ...) vaut 0, pour un tableau
de bool chaque lment vaut false, et pour un tableau de rfrences (objet, interface, tableau)
chaque lment vaut null.
[modifier]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 :
aux lments
L'accs (lecture et criture) aux lments du tableau se fait en utilisant le nom du tableau suivi des
crochets encadrant l'index de l'lment accd :
entiers[0] = 7;
entiers[1] = 13;
Console.WriteLine("1er entier = " + entiers[0] );
L'index spcifi est en fait une expression. Il est donc possible d'utiliser une variable comme index,
par exemple, pour parcourir les lments du tableau :
for(int i=0 ; i<2 ; i++)
Console.WriteLine("entier n" + i + " = " + entiers[ i ] );
[modifier]Taille
d'un tableau
L'attribut Length donne la taille du tableau. Ce qui est pratique pour le parcourir :
Console.WriteLine("Le tableau contient " + entiers.Length + " entiers :");
for(int i=0 ; i<entiers.Length ; i++) // i : index dans le tableau
Console.WriteLine(" ["+i+"] = " + entiers[i] );
Si l'index n'est pas ncessaire durant le parcours du tableau, il est plus simple d'utiliser foreach :
Console.WriteLine("Le tableau contient " + entiers.Length + " entiers :");
foreach(int n in entiers) // n : lment du tableau
Console.WriteLine(" " + n );
[modifier]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][];
Les objets
Un objet est un type rfrence. Il s'agit d'une instance de classe.
allocation d'une zone mmoire d'une taille suffisante pour accueillir les attributs dfinis dans
la classe spcifie,
initialisation des attributs leur valeur par dfaut (dfinie dans la classe ou 0 sinon),
Les classes
La notion de classe est la base de la programmation oriente objet. Elle dfinit un type d'objet. Ce
type rassemble des variables (cres pour chaque objet et appeles attributs ) et des fonctions
(appeles dans ce cas mthodes ).
Ces attributs et mthodes sont les membres de la classe. Ils peuvent avoir chacun un niveau de
protection diffrent.
Sections
[masquer]
2 Niveaux de protection
3 Constructeur
3.1 Exemple
[modifier]Dclarer
une classe
this.numerateur *= autre.numerateur;
this.denominateur *= autre.denominateur;
}
}
[modifier]Membres
d'une classe
Les fonctions, appeles mthodes, traitent les donnes, appellent d'autres mthodes, retournent
ventuellement une valeur ;
Les proprits sont des mthodes spciales utilises comme des variables.
[modifier]Membres
Un membre statique de classe est un membre dclar avec le mot cl static. Il est dfinit une seule
fois en mmoire, et il n'est pas ncessaire de crer un nouvel objet pour qu'il soit cr et utilisable.
Un membre d'instance est dclar sans le mot cl static. Il n'est cr que pour chaque objet (une
instance) cr par l'oprateur new.
Exemple :
public class UnExemple
{
int numero; // Dfini pour chaque objet
static int numero_suivant; // Dfini pour la classe
}
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 );
[modifier]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");
[modifier]Instance d'une classe
L'instance d'une classe est aussi appele un objet. Une variable de ce type est un type rfrence,
c'est dire que la rfrence est nulle par dfaut. Il faut donc utiliser le mot cl new pour allouer une
instance de la classe.
Exemple :
UnExemple objetExemple; // par dfaut : null
// Equivaut
UnExemple objetExemple = null;
objetExemple = new UnExemple();
Le mot cl new est suivi du nom de la classe et d'une liste de paramtres entre parenthses. Il s'agit
en fait d'un appel au constructeur (abord plus loin dans ce chapitre) initialisant l'objet cr.
[modifier]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.
[modifier]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
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 :
Les attributs sont privs. Si un accs est ncessaire, il faut ajouter des
mthodes d'accs (accesseurs), voire une proprit.
[modifier]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.
[modifier]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 :
this.numerateur = numerateur;
this.denominateur = denominateur;
}
public void multiplier(Fraction autre)
{ }
}
Utilisation :
Fraction estimation_pi = new Fraction( 355 , 113 );
[modifier]Constructeur par dfaut
Le constructeur par dfaut est celui qui n'a aucun paramtre. Si aucun
constructeur n'est dclar dans une classe, le compilateur cre un constructeur
par dfaut qui ne fait rien, laissant les attributs leur valeur par dfaut
(dpendant du type : 0 pour les numriques, null pour tous les autres).
En fait, ce constructeur par dfaut appelle le constructeur sans argument (qu'il
soit par dfaut ou explicitement implment) de la classe de base
(System.Object par dfaut). Voir le chapitre sur l'hritage de classe.
[modifier]Constructeur
statique
Les fonctions
Une fonction tant toujours dclare dans une classe, elles sont plutt appeles mthodes .
Sections
[masquer]
4 Surcharge de mthode
[modifier]Dclarer
une mthode
O accs est optionnel et dfinit le mode d'accs (public, priv ou protg), le type de mthode
(statique ou d'instance). Voir le chapitre sur les classes.
type_retour spcifie le type de la valeur retourne par la fonction. Ce type peut tre void (vide) pour
indiquer que la fonction ne retourne aucune valeur.
La fonction retourne une valeur en utilisant le mot cl return. L'instruction return interrompt
l'excution de la fonction, retourne la valeur de l'expression qui suit, et l'excution du code ayant
appel la fonction se poursuit.
La syntaxe est :
return expression;
Si la fonction ne retourne rien, l'instruction return n'est pas obligatoire, mais si elle est utilise,
aucune expression ne doit tre spcifie. Si la fonction ne retourne rien on appelera cette fonction une
procdure
Exemple :
// Fonction qui retourne la concatnation
// de la chane de caractres a la chane de caractres b
string Concatener(string a, string b)
{
return a+b;
}
[modifier]Appeler
une mthode
L'appel une mthode se fait en spcifiant son nom, suivi des arguments entre parenthses :
nom_methode ( expression, ... )
Si la fonction retourne une valeur, l'appel celle-ci peut tre utilis dans une expression.
Exemple :
string c = Concatener ( "abc" , "def" );
// c vaut "abcdef"
Dans cet exemple, la mthode appele est nomme Concatener car situe dans la mme classe
que l'appel. Cependant, toute mthode s'applique un objet. Celui-ci doit tre spcifi avant le nom
de la fonction, et spar par le caractre point ( . ). Par dfaut, il s'agit de l'objet this (objet courant).
[modifier]Passage
Les paramtres passs une mthode peuvent tre passs de trois manire diffrentes :
un paramtre rfrenant une variable pour y mettre une valeur de retour : paramtre out,
un paramtre rfrenant une variable pour transmettre une information et y mettre une valeur de
retour : paramtre ref.
[modifier]Passage
par valeur
Il s'agit d'un paramtre servant transmettre une information la mthode appele, comme dans les
exemples prcdents. Si la mthode modifie sa valeur, la modification est locale la fonction
uniquement. Un paramtre normal n'est prcd d'aucun mot-cl particulier.
Exemple :
private void methodeTest(int nombre)
{
Console.WriteLine("fonctionTest : le nombre vaut " + nombre);
nombre = 100;
Console.WriteLine("fonctionTest : le nombre vaut " + nombre);
}
private void testAppel()
{
int n = 5;
Console.WriteLine("testAppel : le nombre vaut " + n);
methodeTest(n); // Appel la mthode
Console.WriteLine("testAppel : le nombre vaut " + n);
// On peut passer une expression ou une constante
methodeTest( 25 + 5 ); // Appel la mthode
}
Ce programme affiche :
testAppel : le
fonctionTest :
fonctionTest :
testAppel : le
fonctionTest :
fonctionTest :
nombre vaut 5
le nombre vaut
le nombre vaut
nombre vaut 5
le nombre vaut
le nombre vaut
[modifier]Paramtre
out
5
100
30
100
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
[modifier]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);
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
variable de paramtres
Une mthode peut possder un nombre variable de paramtres, comme, par exemple, la mthode
statique Format de la classe String :
string message = String.Format("A={0} et B={1}", a, b);
Ce genre de mthode possde un nombre de paramtres obligatoires, comme une mthode normale,
suivis d'un nombre variable de paramtres (voire aucun). Ces paramtres en nombre variable sont en
fait transmis sous la forme d'un tableau.
Une telle mthode utilise le mot cl params pour le dernier paramtre qui doit tre un tableau.
Exemples de mthodes :
public string MessageDeLog(string format, params object[] parametres)
{
return "LOG: "+String.Format(format, parametres);
}
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 } );
[modifier]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 :
Ce code contient une erreur volontaire !
Les deux mthodes ont la mme signature.
public double Longueur ( string chaine )
{
return (double) chaine.Length;
}
public int Longueur ( string chaine )
{
return (int) chaine.Length;
}
Proprits et indexeurs
Sections
[masquer]
1 Les proprits
1.1 Syntaxe
1.2 Exemple
2 Les indexeurs
2.1 Syntaxe
2.2 Exemple
[modifier]Les
proprits
Une proprit est une valeur qui peut tre lue ou modifie, comme une variable. Ces deux oprations
sont en fait ralises par les accesseurs get et set. Si l'un de ces deux accesseurs est manquant, la
proprit sera alors soit en lecture seule, soit en criture seule.
[modifier]Syntaxe
Type Nom_de_la_proprit
{
get // proprit lue
{
code retournant une valeur du Type spcifi
}
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"
}
[modifier]Exemple
private string _message;
public string Message
{
get
{
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
[modifier]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()
La classe ne peut donc avoir de mthodes portant l'une de ces deux signatures.
[modifier]Les
indexeurs
Un indexeur est une proprit spciale qui permet d'utiliser une instance de la classe comme
un tableau, en utilisant les crochets.
[modifier]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.
L'index peut avoir un autre type que int. C'est le cas des tables de hashage de
l'espace de nom System.Collections.
[modifier]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
Hritage de classes
Une classe peut hriter d'une autre, c'est dire possder les mmes mthodes et attributs que celle-ci
et en avoir des supplmentaires. Cette nouvelle classe est appele classe fille ou sous-classe .
Elle hrite d'une classe mre ou classe de base ou super-classe .
L'hritage entre deux classes traduit la relation est un type de . Par exemple, une automobile est
un type de vhicule. Elle possde la mme fonctionnalit de transport que n'importe quel vhicule. En
mme temps, une automobile a des fonctionnalits plus prcises qu'un vhicule : transport de
personnes principalement, capacit de transport limite, nombre de portes, puissance du moteur, ...
Ces spcificits de la sous-classe sont les seules qui ont besoin d'tre dfinies dans celle-ci. Les
autres fonctionnalits sont hrites de la super-classe.
Sections
[masquer]
1 Syntaxe
2 Constructeurs
3 Rfrence d'instance
4.3 Rsum
[modifier]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
{
string couleur;
public Automobile()
{
}
}
[modifier]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
{
}
}
[modifier]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();
[modifier]Surcharge
de mthodes et de proprits
sans polymorphisme
La surcharge d'une mthode consiste crer une mthode dans une sous-classe ayant le mme nom
et les mmes types d'arguments (la mme signature) qu'une mthode de la classe de base, afin de
modifier son comportement.
Exemple :
public class Vehicule
{
private int poids;
public Vehicule(int poids)
{ this.poids = poids; }
public string Description()
{
return "Vhicule de "+poids+" tonnes";
}
}
public class Automobile : Vehicule
{
private string couleur;
public Automobile(int poids,string couleur)
: base(poids)
{ this.couleur = couleur; }
// mthode surcharge
public string Description()
{
return base.Description()+" de couleur "+couleur;
}
}
Cependant, le compilateur gnre un avertissement (warning CS0108) dans la classe drive. Il faut
spcifier que l'on surcharge une mthode, en utilisant le mot cl new :
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.
[modifier]Surcharge
avec polymorphisme
Le polymorphisme permet d'utiliser le type rel de l'objet rfrenc plutt que le type de la rfrence
pour dterminer la mthode, la proprit ou l'indexeur utiliser. Pour cela, il faut utiliser le mot
clvirtual dans la dclaration de la mthode de la classe de base.
Exemple :
public class Vehicule
{
private int poids;
[modifier]Classe
virtual
Sans polymorphisme
sans hritire
Sans polymorphisme
Avec polymorphisme
Le mot-cl sealed empche la cration de classes drives. Cette fonctionnalit est galement utile
pour les classes ne dclarant que des membres statiques.
Syntaxe:
sealed class nom_classe
Exemple:
public sealed class Ferrari : Automobile
{
private int consommation;
public Ferrari(int litre_par_km)
: base(5100, "Rouge")
{ consommation = litre_par_km; }
}
Ce type de classe ne peut avoir de mthodes abstraites (abstract) ou de membres protgs
(protected) car aucune classe drive ne pourra tre cre pour les implmenter / y accder.
Classe abstraite
Une classe abstraite possde au moins une mthode abstraite ou une proprit abstraite, c'est dire
ne comportant aucune implmentation (pas de code). Une telle classe ne peut tre instancie avec
l'oprateur new. Il faut utiliser une sous-classe implmentant les mthodes abstraites de la classe de
base.
Sections
[masquer]
1 Syntaxe
3 Proprits abstraites
4 Mode d'accs
[modifier]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);
protected abstract void Retirer(object o);
}
[modifier]Implmenter
La classe implmentant les mthodes abstraites de la classe de base doit utiliser le mot
cl override, car les mthodes abstraites sont implicitement virtuelles galement :
public class EnsembleTableau : Ensemble
{
private object[] elements = new object[0];
public override bool Contient(object o)
{
// recherche de l'objet
for(int i = 0 ; i < elements.Length ; i++)
if (elements[i] == o) return true; // objet trouv
// fin de la boucle sans avoir trouv l'objet
return false;
}
protected override void Ajouter(object o)
{
// ...
}
protected override void Retirer(object o)
{
// ...
}
}
La classe peut ne pas implmenter toutes les mthodes abstraites de la classe de base. Dans ce cas
elle est galement abstraite, et laisse le soin ses sous-classes d'implmenter les mthodes
abstraites restantes.
[modifier]Proprits
abstraites
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.
Les exceptions
Une exception est cre et lance quand une erreur survient. Elle se propage dans la pile d'appel de
la manire suivante : partir du moment o elle est lance, l'excution normale est interrompue, et un
gestionnaire d'exceptions est recherch dans le bloc d'instruction courant. S'il n'est pas trouv, la
recherche se poursuit dans le bloc englobant celui-ci, ou dfaut, dans le bloc de la fonction
appelante, et ainsi de suite... Si la recherche n'aboutit pas, une bote de dialogue signalant l'exception
est affiche.
Sections
[masquer]
[modifier]Attraper
une exception
Un gestionnaire d'exception attrape une classe d'exception particulire et gre le cas d'erreur
correspondant. Ce gestionnaire encadre les instructions grer pouvant lancer une exception.
La syntaxe est la suivante :
try
{
// Une exception peut tre lance
instructions
}
catch ( classe_d_exception variable )
{
// Grer l'erreur en fonction des dtails
// de l'erreur contenus dans la variable
instructions
}
...autres blocs catch...
finally
{
// 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("
}
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");
}
[modifier]Librer
des ressources
Un bloc finally est utile pour librer des ressources la fin d'un traitement, qu'une erreur ait eu lieu
ou non.
Exemple :
Bitmap bm;
try
{
bm=new Bitmap(100,100);
...
}
finally
{
bm.Dispose(); // librer les ressources
}
Cependant, les classes implmentant l'interface IDisposable ont une mthode Dispose(), et
peuvent tre utilises avec le mot cl using :
using( Bitmap bm = new Bitmap(100,100) ) // <- objet IDisposable
{
...
} // <- mthode Dispose() appele automatiquement
[modifier]Lancer
une exception
En cas d'erreur dans une mthode d'un programme (arguments invalides, ...), il est possible de lancer
une exception en utilisant le mot cl throw.
La syntaxe est la suivante :
throw objet_exception;
La pile d'appel est enregistre dans l'objet exception au moment o il est cr.
Dans un gestionnaire d'exceptions, il est possible de relancer l'exception attrape en utilisant
l'instruction throw sans argument. Ce qui est utile quand le gestionnaire ne gre que partiellement
l'erreur qui devra tre totalement traite par un autre gestionnaire d'exceptions.
Exemple :
try
{
Console.Write("Entrez un nombre : ");
int n = int.Parse( Console.ReadLine() );
Console.WriteLine(" 100/nombre = "+( 100/nombre ));
}
catch ( DivideByZeroException dbzex )
{
Console.Error.WriteLine(" Division par zro");
throw; // relance la mme exception
}
[modifier]Crer
Lancer une exception signale une erreur particulire. Si aucune classe d'exception ne convient ou
n'est suffisamment prcise, ou si l'exception doit comporter des informations supplmentaires, il est
possible de crer une nouvelle classe d'exception.
Pour cela, il faut driver la classe Exception ou l'une de ses sous-classes. Par convention, toutes
ces sous-classes ont un nom se terminant par Exception.
Exemple :
public class ErreurDeScriptException : Exception
{
// Attributs
private int ligne,colonne;
private string fichier;
// 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);
1 Syntaxe
3 Oprateurs de conversions
3.1 Explicite/Implicite
[modifier]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 );
}
}
[modifier]Implmentation
par paire
La surdfinition de certains oprateurs exige galement la surdfinition d'un autre. Ces oprateurs
doivent donc tre surdfinis par paire.
Il s'agit des paires d'oprateurs suivantes :
operator == et operator !=
{
return b <= a;
}
[modifier]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; }
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
[modifier]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