Sommaire: C# Partie 1
Sommaire: C# Partie 1
Sommaire: C# Partie 1
NET C# Partie 1
SOMMAIRE
1 La Plate-Forme Microsoft .NET .................................................................... 3
1.1 Les composants de .NET .......................................................................... 3
1.2 L’architecture .NET Framework .............................................................. 3
1.2.1 CLR .................................................................................................... 4
1.2.2 Les bibliothèques de classes .NET Framework ................................. 4
1.2.3 MSIL et les JITters ............................................................................. 5
1.2.4 Système de types commun (CTS) ...................................................... 7
1.2.5 Métadonnées et Réflexion .................................................................. 7
1.2.6 Sécurité ............................................................................................... 7
2 Concepts et notions de bases .......................................................................... 8
2.1 Architecture d’un projet C# ...................................................................... 8
2.2 Le système de types ................................................................................ 11
2.2.1 Valeurs et références ........................................................................ 11
2.2.2 System.Object ................................................................................... 12
2.2.3 Types et Alias ................................................................................... 13
2.2.4 Espaces de noms (namespace) ......................................................... 14
2.3 Le langage de programmation C# .......................................................... 15
2.3.1 Types et variables ............................................................................. 15
2.3.2 Expressions et opérateurs ................................................................. 17
2.3.3 Contrôle de flux ................................................................................ 19
2.3.4 Procédures et fonctions .................................................................... 20
2.3.5 Gestion des exceptions ..................................................................... 21
2.4 Classes .................................................................................................... 22
2.4.1 Définition d’une classe ..................................................................... 22
2.4.2 Héritage ............................................................................................ 23
2.4.3 Les méthodes .................................................................................... 24
2.4.4 Le polymorphisme ............................................................................ 27
2.4.5 Surcharge .......................................................................................... 31
2.4.6 Les membres simples ....................................................................... 32
2.5 Interfaces ................................................................................................. 33
2.6 Délégués et gestionnaires d’événements ................................................ 34
3 Contrôles et Objets de base .......................................................................... 34
3.1 Contrôles et objets usuels ....................................................................... 35
3.1.1 Contrôles Label, TextBox, Button, radioButton, ListBox,
ComboBox .................................................................................................... 35
3.1.2 Les paramètres des événements ....................................................... 36
3.1.3 L’objet MessageBox......................................................................... 37
3.1.4 Le contrôle Timer ............................................................................. 37
3.1.5 Le contrôle PictureBox ..................................................................... 37
3.1.6 Contrôle ImageList ........................................................................... 38
3.1.7 Les contrôles ListView et TreeView ................................................ 38
.NET représente un univers où les entités coopèrent pour fournir des solutions
aux utilisateurs. .NET comprend quatre grands composants.
1.2.1 CLR
On parle à ici de code géré ou managé (managed code), dans les sens que le
code exécuté est sous le contrôle de CLR. Dans un environnement de code géré,
un certain nombre de règles garantissent que les applications se comportent
d’une manière globalement uniforme, et ce, indépendamment du langage ayant
servi à les écrire. Le comportement homogène des applications est l’essence de
.NET. Ces règles globales avant tout les créateurs de compilateurs.
OS CLR
VBRUN
Code managé
ASP
exposées par CLR. Les langages ne sont que des interfaces syntaxiques vers les
bibliothèques de classes.
System.Web System.Windows.Forms
Services UI Design ComponentModel
Description HtmlControls
Discovery WebControls
System.Drawing
Protocols
Drawing2D Printing
Configuration SessionState
System.Data System.Xml
ADO SQL XSLT Serialization
System
Collections IO Security Runtime
InteropServices
Configuration Net ServiceProcess
Remoting
Diagnostics Reflection Text
Serialization
Globalization Resources Threading
Pour permettre aux créateurs de langages de porter ces derniers vers .NET,
Microsoft a inventé une sorte d’assembleur baptisé MSIL (Microsoft
Intermediate Language). Pour compiler une application destinée à .NET, le
compilateur concerné lit le code source (écrit en VB, C# ou tout autre langage
conforme aux spécifications CLS), puis génère du code MSIL. Ce code MSIL
sera traduit en langage machine lorsque l’application sera exécutée pour la
première fois par CLR. Plus précisément voici l’enchaînement des opérations :
1.2.6 Sécurité
ou
Web
Page HTML Local .htm Page web classique
ou
Web
Formulaire hérité Local .vb ou .cs Formulaire dont l’aspect et le
comportement sont issus de ceux d’un
formulaire Windows existant
Fichier texte Local .txt Fichier texte vide
ou
Web
Feuille de style Local .css Feuille de style en cascade exploitée
ou par des pages web HTML pour la
Web définition des styles
Classe Installer Local .vb ou .cs Fichier utilisé pour créer une
ou procédure d’installation personnalisée
Web
Etat Crystal Local .rpt Fichier destiné à la création d’un état
Reports ou Crystal Report ; l’ouverture d’un tel
Web fichier provoque celle de l’application
Crystal Report Designer
Bitmap Local .bmp Image bitmap
ou
Web
Fichier curseur Local .vb ou .cs Fichier de création d’un curseur
personnalisé
Fichier icône Local .vb ou .cs Fichier de création d’une icône
personnalisée
Fichier JScript Local .js Fichier de code JScript.NET vide
ou
Web
Fichier VBScript Local .vbs Fichier de code VBScript vide (Visual
ou Basic Scripting Edition)
Web
Windows Script Local .wsf Fichier de code vide utilisé pour les
Host ou scripts
Web
Page ASP Web .asp Fichier ASP (Active Server Page)
contenant des balises de formatage
HTML ainsi que du code s’exécutant
au niveau du serveur web
Fichier de Local .resx Fichier permettant de stocker des
Bien que le CTS soit entièrement orienté objet on distingue deux catégories de
types : les types valeur et les types référence.
Types valeur
Une variable de type valeur contient des données et ne peut prendre la valeur
null. Par exemple int i =24 ; crée une variable ayant le type CTS System.Int32
Types référence
Un type référence ressemble à une référence du C++, en ce sens qu’il s’agit d’un
pointeur « sécurisé au niveau du type ». Une référence si elle est différente de
null pointe toujours vers un objet du type spécifié, objet qui a déjà été alloué sur
le tas (heap). Par exemple string s= "exemple" ; une valeur est allouée sur le tas
et s est un type référence (string) vers cette valeur.
Quand on déclare une variable C# de type référence (classe, tableau, délégué ou
interface), on alloue sur le tas le nombre d’octets associés au type concerné et on
manipule l’objet indirectement via une référence.
Boxing et Unboxing
2.2.2 System.Object
Comme tous les types dérivent d’une façon ou d’une autre de System.Object, ils
ont en commun un certain nombre de méthodes.
Méthode Description
bool Equals() Compare deux références d’objet ou types valeur pour
savoir s’il s’agit du même objet ou les deux valeurs sont
identiques
int GetHashCode() Donne le code de hachage spécifié pour un objet
Type GetType() Permet d’obtenir les données de type d’un objet
string ToString Par défaut donne le nom de l’objet
CTS définit des types susceptibles de resservir dans tous les langages .NET.
Chaque langage définit des alias pour ces types. Les alias pour C# sont :
Type CTS Alias C# Description
System.Object object Classe de base de tous les types CTS
System.String string Chaîne de caractères
System.SByte sbyte Octet signé sur 8 bits
System.Byte byte Octet non signé sur 8 bits
System.Int16 short Valeur signée sur 16 bits
System.UInt16 ushort Valeur non signée sur 16 bits
System.Int32 int Valeur signée sur 32 bits
System.UInt32 uint Valeur non signée sur 32 bits
System.Int64 long Valeur signée sur 64 bits
System.UInt64 ulong Valeur non signée sur 64 bits
System.Char char Caractère Unicode sur 16 bits
System.Single float Valeur en virgule flottante IEEE sur 32 bits
System.Double double Valeur en virgule flottante IEEE sur 64 bits
System.Boolean bool Valeur booléenne (True ou False)
System.Decimal decimal Valeur sur 128 bits
Conversion de type
La conversion entre les types simples char, int et float est implicite.
La conversion entre une chaîne et les autres types est définie par :
nombre chaîne nombre.ToString() ;
chaîne int int.Parse(chaine) ou System.Int32.Parse(chaine)
chaîne long long.Parse(chaine) ou System.Int64.Parse(chaine)
chaîne double double.Parse(chaine) ou System.Double.Parse(chaine)
chaîne float float.Parse(chaine) ou System.Float.Parse(chaine)
Entre une classe de base et une classe dérivée, il peut y avoir conversion
implicite vers l’amont (upcasting). Par exemple :
class Etudiant { }
class MaitriseEtudiant : { }
class Exemple1 {
public static void Main () {
Etudiant e = new MaitriseEtudiant() ;
}
}
Les espaces de noms permettent d’organiser les classes et les autres types au
sein d’une seule et même structure hiérarchique. Un même espace de noms peut
s’étaler sur plusieurs fichiers de code source. Cela permet, par exemple, de
placer dans un fichier source séparé chacune des classes d’un espace de noms.
Ils sont définis à l’aide de l’instruction namespace et peuvent être imbriqués.
namespace <nom_espace>
{
class <nomclasse>
{…}
class <nomclasse2>
{ …}
}
Ils offrent un moyen d’abréger des noms très longs de classes et autres types.
Le mot clé using permet d’accéder à toutes les classes d’un espace de noms.
Par exemple :
//utilisation du nom complet d’une classe
class Expl1 {
public static void Main() {
System.Console.WriteLine("test") ;
}
}
Les tableaux
Par exemple :
int [, ,] entiers ; //déclare un tableau à 3 dimensions
Par exemple :
entiers = new int[2,4,3] ; //instancie un tableau multidimensionnel
Par exemple :
using System ;
class Controle {
virtual public void Salut() {
Console.WriteLine("Contrôle");
}
}
class Bouton : Controle {
override public void Salut() {
Console.WriteLine("Bouton");
}
}
class Liste : Controle {
override public void Salut() {
Console.WriteLine("Liste");
}
}
class AppTableauImbri {
public static void Main() {
Controle [][] controles;
Controles = new Controle[2][];
Controles[0] = new Controle[3];
for (int i = 0; i< controles[0].Length; i++) {
controles[0][i] = new Bouton();
}
controles[1] = new Controle[2];
for (int i=0; i<controles[1];Length; i++) {
controles[1][i] = new Liste();
}
for (int i =0; i< controles.Length; i++) {
for (int j=0; j<controles[i].Length;j++)
{
Controle uncontrole = controles[i][j];
Uncontrole.Salut();
}
}
string str = Console.ReadLine();
}
}
Structures et énumérations
Catégories Opérateurs
Opérateurs fondamentaux (x), x.y, f(x), a[x], x++, x--, new,
typeof, sizeof , checked, unchecked
Opérateurs unaires +, -, !, ~, ++x, --x, (T)x
Opérateurs multiplicatifs *, /, %
Opérateurs additifs +, -
Opérateurs de décalage <<, >>
Opérateurs de comparaison <, >, <=, >=, is
Opérateurs d’égalité ==
Opérateurs logiques AND, XOR, OR &, ^, |
Opérateurs conditionnels AND, OR &&, ||
Opérateur conditionnel ?:
Opérateur d’affectation =, *=, /=, %=, +=, -=, <<=, >>=, &=,
^=, |=
Opérateur typeof
Opérateurs is et as
Surcharge d’opérateurs
Un certain nombre d’opérateurs sont susceptibles d’être surchargés. Ce sont :
- Opérateurs unaires +, -, !, ~, ++, --, true, false ;
- Opérateurs binaires +, - , *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >= et <=
La syntaxe de surcharge est :
public static <type> operator <symbol_opérateur> (objet1 [, objet2])
{ corps }
Par exemple :
struct complexe { float reel, imag ;} ;
public static complexe operator + (complexe x, complexe y)
{ complexe z ;
z.reel = x.reel + y.reel ;
z.imag = x.imag + y.imag;
}
Structure if
La syntaxe générale est :
if(expression)
instruction1
[else
Instruction2]
Structure switch
La syntaxe générale est :
switch(expression) {
case expression-constante : instruction ; instruction-de-saut ;
…
case expression-constanteN : instructionN ; instruction-de-saut ;
[default : instruction ; instruction-de-saut]
}
Structure while
while(expression)
corps
Structure do/while
do
corps
while (expression)
Structure for
Les parenthèses du for comprennent trois parties, dont chacune peut être vide.
Dans les parties « initialisation » et « pas » de la structure for, l’opérateur
virgule permet de spécifier plusieurs instructions qui seront exécutées en
séquence. La partie « initialisation » est effectuée une seule fois, avant la
première exécution de la boucle.
Structure foreach
2.3.3.3 Débranchements
Instruction break
Permet de sortir d’une boucle ou d’une structure conditionnelle.
Instruction continue
L’instruction continue arrête l’exécution du corps de la boucle et fait sauter le
programme au début du passage suivant dans la boucle.
Instruction goto
Les syntaxes possibles sont :
goto identificateur
goto case expression-constante
goto default
Instruction return
Spécifie une valeur à retourner à l’appelant (si le code appelé n’est pas étiqueté
void) et provoque l’arrêt de l’exécution du code appelé. La syntaxe est :
return [expression]
Le traitement des exceptions repose sur 4 mots clés : try – catch – throw et
finally.
Déclenchement d’exception
Si une méthode peut créer une exception, une autre peut intercepter cette
exception. Le mot clé catch définit un bloc de code, dit « gestionnaire
d’exception », qui sera exécuté quand une exception d’un certain type aura été
interceptée. Pour intercepter une exception, on place dans un bloc try le code à
exécuter puis on spécifie dans un bloc catch les types d’exception que le code du
bloc try doit traiter.
La syntaxe est :
try
{ le code protégé
}
Catch(Exception e)
{ code de gestion des exceptions
On peut ajouter un bloc de code qui sera exécuté dans tous les cas qu’il y ait
interception ou non à l’aide du mot clé finally.
finally
{ code exécuté en fin de compte
}
2.4 Classes
classes dérivées
- private : membre inaccessible depuis l’extérieur, classe dérivées
comprises ; modificateur par défaut
- internal : membre visible uniquement à l’intérieur de l’unité de
compilation courante.
2.4.2 Héritage
L’héritage consiste à définir une classe qui s’appuie sur une autre classe en
termes de données et de comportements. En outre, la classe dérivée peut
s’utiliser à la place de la classe de base.
Par exemple :
class Personne
{
private String nom;
private int age;
public int nbre_enf;
public Personne(String name, int n)
{ nom=name; age=n;}
}
classe Eleve: Personne
{
private String ecole;
public String classe;
public Eleve(String n, int a, String e): base(n, a)
{ ecole=e;}
}
Interfaces multiples
C# ne gère pas l’héritage multiple basée sur la dérivation. Par contre, l’on peut
effectuer de l’héritage multiple avec des interfaces. Par exemple :
Classes scellées
Les méthodes (fonctions ou procédures) sont les codes opérant sur les données
de l’objet.
La méthode Main
Une application C# doit contenir une méthode Main, publique et statique, qui
sert de point d’entrée. Main est généralement placée dans une classe ad hoc (qui
convient). Par exemple :
class Etudiant {
private int etudiantId ;
}
class Prog {
static public void Main() ‘
Etudiant e = new Etudiant() ;
}
}
Constructeur
C’est une méthode spéciale, exécutée chaque fois qu’il y a création d’une
instance. Un constructeur garantit que l’objet sera correctement initialisé avant
toute utilisation. Les constructeurs portent les noms des classes associées, par
exemple :
using System ;
class ConstructeurApp {
ConstructeurApp(){
Console.WriteLine("je suis un constructeur") ;
}
…
}
Une méthode n’a qu’une seule valeur de retour, alors que parfois il est
nécessaire de retourner plusieurs valeurs au programme appelant ; dans ce cas
on utilise ref ou out devant les arguments de la méthode.
La différence entre ref et out est qu’avec ref il est nécessaire d’initialiser les
arguments.
L’on peut définir une méthode dont le nombre de paramètre est variable à l’aide
du mot-clé params. Par exemple : public double somme (params double[] liste)
Méthode statique
Une méthode statique existe au niveau global de la classe, pas au niveau d’une
instance spécifique ; l’on n’a pas besoin d’instancier la classe pour pouvoir
utiliser la méthode. Pour définir une méthode statique, on utilise le mot-clé static
dans la définition ; on appelle une méthode statique par la syntaxe
Classe.Méthode et non Objet.Méthode. Une méthode statique ne peut accéder
qu’aux membres statiques de la classe.
Le mot clé abstract est utilisé pour représenter une classe ou méthode abstraite.
2.4.4 Le polymorphisme
Polymorphisme d’objet
y = (Fille)x ;
Polymorphisme de méthode
Lorsqu'une classe enfant hérite d'une classe mère, des méthodes supplémentaires
nouvelles peuvent être implémentées dans la classe enfant mais aussi des
méthodes des parents peuvent être substituées pour obtenir des implémentations
différentes. On parle de polymorphisme de méthode. Il se présente sous deux
formes :
}
}
}
protected string Name ;
public string name {
get {return this.Name ;}
}
virtual public void CalculPaie() {
Console.WriteLine("appel de Employe.CalculPaie pour ",name) ;
}
}
2.4.5 Surcharge
Surcharge de méthode
Elle consiste à créer plusieurs méthodes ayant le même nom, mais des
arguments différents. Cette technique permet d’une part d’avoir une méthode
dont le comportement varie selon les types de valeur qui lui sont passés et
d’autre part d’instancier de plusieurs manières une classe (pour les
constructeurs). Par exemple :
class Rectangle{
private float L ;
private float l ;
Rectangle(float longueur, float largeur) //initialisation
{ L=longueur ; l=largeur ;}
Rectangle() //autre initialisation possible
{L=0 ; l=0 ;}
private float perimetre()
{return(2*(L+l)) ;}
public float surface()
{return (L*l); }
}
Surcharge d’opérateur
Propriétés
Elles permettent d’accéder aux champs non publics comme s’il s’agissait de
champs publics. Une propriété se compose d’une déclaration de champ et de
méthodes (getter et setter) servant à accéder à la valeur du champ. Par exemple:
class Adresse {
protected string ville ;
protected string codePostal ;
public string CodePostal {
get {return codePostal ;}
set {
// Contrôle du Code Postal
codePostal = value ;
// calul de la ville à partir du Code Postal
}
}
}
Le paramètre mot clé value est utilisé pour recevoir la valeur à affecter.
Attention, ne pas confondre le champ Adresse.codePostal et la propriété
Adresse.CodePostal.
Un exemple d’utilisation est :
Adresse adr = new Adresse() ;
adr.CodePostal = "5893" ;
string lecode = adr.CodePostal ;
Indexateurs
Par exemple :
class MaClasse {
public object this [int index] {
get { //lecture des données idoines}
set { //modification des données}
}
}
2.5 Interfaces
• Une interface C# est un contrat, elle peut contenir des propriétés, des
méthodes , des événements ou des indexeurs, mais ne doit contenir aucun
champ ou attribut.
• Une interface ne peut pas contenir des méthodes déjà implémentées.
• Une interface ne contient que des signatures (propriétés, méthodes ).
• Tous les membres d'une interface sont automatiquement public.
• Une interface est héritable.
• On peut construire une hiérarchie d'interfaces.
• Pour pouvoir construire un objet à partir d'une interface, il faut définir une
classe non abstraite implémentant tous les membres de l'interface.
Déclaration d’interface
interface nomInterface {
//déclaration de méthode
type Methode1() ;
//déclaration de propriété
type Propriete { get ;}
//déclaration d’événement
event typeEvenement Evenement ;
//déclaration d’indexateur
type this[int indx] {get ; set ;}
}
La liste des contrôles utilisables est donnée par la boite à outils située le plus
souvent à gauche de la feuille de développement:
La liste des propriétés et des événements pour l’objet sélectionné est donnée par
la fenêtre de propriétés située à droite et en bas.
Les contrôles RadioButton présentent une suite de boutons radio dont un seul
est sélectionnable. La propriété Checked à True spécifique que le bouton est
sélectionné. La propriété Text définit le titre du bouton. L’événement le plus
important est CheckedChanged qui s’exécute quand on a sélectionné un bouton.
Chaque gestionnaire d’événements liste deux paramètres qui sont utilisés dans le
handle. Les gestionnaires d’événements de souris reçoivent un argument de type
MouseEventArgs, les gestionnaires d’événements de touches appuyées
reçoivent un argument de type KeyPressEventArgs et les autres gestionnaires
d’événement un argument de type EventArgs ou xxxEventArgs.
Propriété Fonction
Button Indique quel bouton de souris a été appuyé
Clicks Indique combien de fois l’utilisateur a appuyé sur le bouton de
souris ou l’a relâché
Delta Renvoie un nombre signé indiquant le nombre de crans lors de
la rotation de la roulette de la souris
X Renvoie la coordonnée dans l’axe des X d’un clic de souris
Y Renvoie la coordonnée dans l’axe des Y d’un clic de souris
Propriété Fonction
Handle Renvoie une valeur indiquant si l’événement KeyPress a été
géré
KeyChar Renvoie la valeur KeyChar (caractère appuyé) qui correspond
à la touche appuyée.
Permet d’insérer les formats d’images suivants : JPEG – GIF WMF – BMP.
L’insertion d’image en mode conception s’effectue à l’aide de la propriété
Image. En mode programmation on utilise la méthode FromFile des objets de la
classe Image de la manière suivante : PictureBox1.Image =
image.FromFile(fichier_image)
La Classe Image se trouve dans System.Drawing.
La collection d’images est exploitée par d’autres contrôles tels que les ListView
et TreeView. La modification de l’image au sein du contrôle ImageList implique
le changement automatique au niveau des deux autres contrôles. L’association
s’effectue à l’aide de la propriété ImageList du contrôle. Certains contrôles
disposent de la propriété ImageList pour être liée à un contrôle ImageList :
Button – CheckBox – Label – ListView – RadioButton – TabControl – ToolBar
– TreeView.
Un ListView permet d’afficher des listes d’éléments selon 4 modes définis par la
propriété View :
Mode grandes icônes – Mode petites icônes – Mode liste (liste sur une colonne)
– Mode rapport (Liste personnalisable sur plusieurs colonnes).
Les principales propriétés sont :
Propriété Description
Items Définit la collection d’éléments
SelectedItems Définit la collection d’éléments sélectionnés
View Définit le mode d’affichage
On peut copier et déplacer du texte sélectionné à l’aide des méthodes Copy, Cut
et Paste. De même, on peut tester si certaines mises en forme ont été appliquées
au texte sélectionné à l’aide des propriétés :
SelectionFont.Underline – SelectionFont.StrikeOut – SelectionFont.Italic –
SelectionFont.Bold – SelctionColor.<nomcouleur>. On peut récupérer la
taille, le nom de la police et la couleur du texte sélectionné à l’aide des
propriétés : SelectionFont.Size – SelectionFont.Name –
SelectionColor.toString.
Le point de départ du texte sélectionné est donné par la propriété SelectionStart
et le nombre de caractères sélectionnés par SelectionLength.
Les méthodes Undo et Redo sont disponibles pour les dernières modifications.
Comme pour les TextBox, il y a une collection Lines[] qui contient chacune des
lignes. La propriété ReadOnly à True permet d’interdire la modification.
4 Exercices
TP1 :
Réaliser cette application
TP 2 :
Afficher l’heure courante à l’aide du
contrôle Timer et d’un contrôle Label.
Programmer le contrôle Timer de sorte
que la feuille se décharge au bout d’un
certain nombre de secondes par
affichage d’un compte à rebours.
TP 3 :
TP 4 :
- Remplir un objet ListView avec
un objet ImageList et un objet
TextBox pour saisir le texte de
l’élément.
- Transférer le texte des éléments
sélectionnés dans un objet
ListBox.
TP 5 :
Réaliser un petit éditeur de texte à l’aide d’un RichTextBox et des contrôles
OpenFileDialog et SaveFileDialog