Académique Documents
Professionnel Documents
Culture Documents
1
Première partie.
Notions de base
Qu’est-ce que C# ?
3
C# & le Framework .Net
4
L’environnement Visual Studio .Net
5
L’environnement Visual Studio .Net
Installation:
Si vous n’avez pas encore installé Visual Studio,
accédez à la page Téléchargements Visual Studio pour
l’installer gratuitement.
6
C# & le Framework .Net
7
C# & le Framework .Net
C# & le Framework .Net
C# & le Framework .Net
C# & le Framework .Net
Première application C#
using System;
namespace Test
{ /// <summary>
/// Summary description for Program
/// </summary>
class Program
{ /// <summary>
/// The main entry point for the application.
/// </summary>
public static void Main(string[] args)
{
Console.WriteLine(" Bonjour !");
}
}
}
12
L’explorateur de solutions
13
Fichiers de la solution 1
Test.sln
C’est le fichier le plus haut de la solution. Il y en a un par application.
14
Fichiers de la solution 2
Test.csproj
C’est un fichier de projet C#.
Les fichiers source d’un même projet doivent être rédigés dans le même
langage de programmation.
15
Fichiers de la solution 3
Program.cs
C’est un fichier source C#, dans lequel vous allez rédiger votre code.
16
Fichiers de la solution 4
AssemblyInfo.cs
C’est un autre fichier source C#.
17
Fichiers de la solution 5
App.ico
C’est l’icône associé à l’application.
18
Les espaces de noms
Si une ressource n’est déclarée dans aucun espace de noms elle fait partie
d’un espace de noms global et anonyme.
using Toto1;
using Toto1.Toto2;
using System;
namespace Toto1
{
// ici les ressources de l'espace de noms Toto1
namespace Toto2
{
// ici les ressources de l'espace de noms Toto1.Toto2
}
// ici les ressources de l'espace de noms Toto1
}
19
Création d’une documentation à l’aide
XML et de commentaires
Dans Visual C#, il est possible de créer la documentation pour le code en
incluant des balises XML dans les champs de commentaires directement
avant le bloc de code auquel elles se réfèrent.
Parmi les balises XML standard prises en charge par le compilateur C#, il
y a: <summary>, <remarks>, <returns>, <value>, <exception>, <param>,
<example>, <para>, <see>, <typeparam>, …..
Exemple :
/// <summary>
/// The main entry point for the application.
/// </summary>
20
Création d’une documentation à l’aide
XML et de commentaires
<summary> : Ajoute des informations succinctes relatives à un type ou un
membre.
Exemple : /// <summary>
/// The main Math class.
/// Contains all methods for performing
basic math functions.
/// </summary>
public class Math
{
// Adds two integers and returns the
result
/// <summary>
/// Adds two integers and returns the
result.
/// </summary>
public static int Add(int a, int b)
{
// If any parameter is equal to the
max value of an integer
// and the other is greater than
zero
if ((a == int.MaxValue && b > 0) ||
(b == int.MaxValue && a > 0))
throw new
System.OverflowException();
return a + b;
}
21
}
Création d’une documentation à l’aide
XML et de commentaires
<remarks> : Complète les informations relatives aux types ou aux membres
fournies par la balise <summary> .
Exemple :
/// <summary>
/// The main Math class.
/// Contains all methods for performing basic math
functions.
/// </summary>
/// <remarks>
/// This class can add, subtract, multiply and divide.
/// </remarks>
22
Création d’une documentation à l’aide
XML et de commentaires
<returns> : Décrit la valeur de retour d’une déclaration de méthode.
Exemple :
/// <summary>
/// Adds two integers and returns the result.
/// </summary>
/// <returns>
/// The sum of two integers.
/// </returns>
public static int Add(int a, int b)
{
// If any parameter is equal to the max value of an integer and
// the other is greater than zero
if ((a == int.MaxValue && b > 0) || (b == int.MaxValue && a > 0))
throw new System.OverflowException();
return a + b;
}
23
Création d’une documentation à l’aide
XML et de commentaires
<value> : La balise <value> est similaire à la balise <returns>, excepté que vous
l’utilisez pour les propriétés.
Exemple :
/// <summary>
/// The main Math class.
/// Contains all methods for performing basic math functions.
/// </summary>
/// <remarks>
/// This class can add, subtract, multiply and divide.
/// These operations can be performed on both integers and doubles
/// </remarks>
public class Math
{
/// <value>Gets the value of PI.</value>
public static double PI { get; }
}
24
Création d’une documentation à l’aide
XML et de commentaires
<exception> : Informer qu’une méthode peut lever des exceptions spécifiques.
Exemple :
25
Création d’une documentation à l’aide
XML et de commentaires
<param> : Décrire les paramètres d’une méthode.
Exemple :
/// <summary>
/// Adds two doubles and returns the result.
/// </summary>
/// <returns>
/// The sum of two doubles.
/// </returns>
/// <exception cref="System.OverflowException">Thrown when one parameter is
/// max and the other is greater than zero.</exception>
/// <param name="a">A double precision number.</param>
/// <param name="b">A double precision number.</param>
public static double Add(double a, double b)
{
if ((a == double.MaxValue && b > 0) || (b == double.MaxValue && a > 0))
throw new System.OverflowException();
return a + b;
}
26
Création d’une documentation à l’aide
XML et de commentaires
27
Les commentaires
Le texte placé entre les balises /* suivie de */ est commenté. Ces balises
peuvent éventuellement se trouver sur deux lignes différentes.
Si une ligne contient la balise // alors le texte de cette ligne qui suit cette
balise est commenté.
Si une ligne contient la balise /// alors le texte de cette ligne qui suit cette
balise est commenté. De plus ce texte fera partie de la documentation
automatique.
28
Votre premier programme
using System;
namespace HelloWorld
{
Class Hello
{
static void Main ()
{
System.Console.WriteLine(" Hello World! ");
// Garder la console window ouverte en mode débogage.
System.Console.WriteLine(" Appuyez sur une touche pour
sortir. " );
System.Console.ReadKey();
}
}
} 29
Les Entrées/ Sorties
30
La méthode Main() (1/3)
31
La méthode Main() (2/3)
Déclarez la méthode Main d'une des manières suivantes :
Elle peut retourner void : static void Main()
{
//…
}
Avec les deux types de retour, elle peut accepter des arguments :
Le paramètre de la méthode Main est un tableau static void Main(string[] args)
string qui représente les arguments de la ligne de {
commande utilisés pour appeler le programme. // ...
}
static int Main(string[] args)
{
// …
}
32
La méthode Main() (3/3)
using System;
class Prog
{ static void Main(string[] args)
{ if (args.Length == 0)
Console.WriteLine("Entrez des nombres à ajouter.");
else { long result = 0;
foreach( string s in args )
result += Int64.Parse(s);
// la méthode Parse Convertit une chaîne de caractère
// en un entier 64-bit signé équivalent.
Console.WriteLine("Somme de ces nombres :{0}",result);
}
}
}
33
Types de données C# prédéfinis (1/2)
Il existe 6 catégories de types prédéfinis C#:
Caractère : char
Logique : bool
34
Types de données C# prédéfinis (2/2)
Les types prédéfinis sont des alias des types CTS définis dans le
framework .Net.
Exemple:
Le type int est un alias de System.Int32
Int32 est une structure qui appartient à l’espace de nom System
35
Types de données C# prédéfinis
Types entiers:
36
Types de données C# prédéfinis
Types de données:
37
Types de données C# prédéfinis
Caractères d'échappement
38
Variables & Types de Données
Déclaration de Variables :
Étape 1 : Déterminer le Type de données à utiliser.
Étape 2 : Créer le nom de la Variable.
Étape 3 : Terminer par un point-virgule.
Exemple : int compteur; double taux;
Initialisation de Variables :
Étape 1 : Utiliser l’opérateur de l’affectation.
Étape 2 : Déterminer la valeur à assigner.
Étape 3 : Terminer par un point-virgule.
Exemple : int compteur = 10; double taux = 150.59;
39
Chaînes de caractères
Une chaîne de caractères peut être déclarée et initialisée de plusieurs
façons:
string s = "Hello World " ;
Résultat : Hello World
string s = "\"Hello\"";
Résultat : "Hello"
string s = "Hello\nWorld";
Résultat : Hello
World
string s = @"C:\Test\SubDirectory";
Résultat : C:\Test\SubDirectory
40
Constantes
Exemple :
const int MAX_EMPLOYES = 3000;
const string SQL_CONNECTION_STRING =
“database=Northwind;user_id =moi; password = secret”;
41
Les conversions entre nombres et chaînes
de caractères
42
Erreurs de conversions
La conversion d'une chaîne vers un nombre peut échouer si la chaîne ne
représente pas un nombre valide. Il y a alors génération d'une erreur
fatale.
43
Les changements de type
44
Les changements de type
Exemple:
int i, j;
float isurj;
isurj= (float)i/j; // priorité de () sur /
Ici il est nécessaire de changer le type de i ou j en réel sinon la division
donnera le quotient entier et non réel.
(float) i est la même valeur codée de façon approchée en réel sur 4 octets
45
Les tableaux, Les énumérations, et les
structures
Pour grouper des variables ou des valeurs, on peut utiliser les trois outils
suivants:
Les tableaux
Les énumérations.
Les structures.
46
Les tableaux de données
Un tableau ou Array C# est un objet permettant de rassembler sous un
même identificateur des données de même type.
47
Les tableaux de données
Les tableaux ont une propriété Length qui est le nombre d'éléments du
tableau.
48
Les tableaux de données
Le nombre d'éléments dans chacune des dimensions peut être obtenue
par la méthode GetLength(i) où i=0 représente la dimension
correspondant au 1er indice, i=1 la dimension correspondant au 2ième
indice, …
49
Exemple 1
//un tableau de tableaux
string [][] noms= new string[3][];
for (int i = 0; i < noms.Length; i++)
{
noms[i] = new string[i + 1];
}
//Initialisation
for(int i=0;i<noms.Length;i++){
for(int j=0;j<noms[i].Length;j++){
noms[i][j]=""+i+j ;
}
}
50
Exemple 2 (1/4)
using System;
// classe de test
public class test {
public static void Main(){
// un tableau à 1 dimension initialisé
int[] entiers=new int[] {0,10,20,30};
for (int i=0;i<entiers.Length;i++)
{
Console.WriteLine("entiers["+i+"]="+entiers[i]);
}
51
Exemple 2 (2/4)
// un tableau à 2 dimensions initialisé
double[,] reels=new double[,] { {0.5, 1.7}, {8.4, -6}};
for (int i=0;i<reels.GetLength(0);i++)
{
for (int j=0;j<reels.GetLength(1);j++)
{
Console. WriteLine("reels["+i+","+j+"]="+reels[i,j]);
}//for j
}//for i
52
Exemple 2 (3/4)
// un tableau de tableaux
string[][] noms=new string[3][];
for (int i=0;i<noms.Length;i++)
{ noms[i]=new string[i+1];
}//for
// initialisation
for (int i=0;i<noms.Length;i++)
{ for(int j=0;j<noms[i].Length;j++)
{ noms[i][j]="nom"+i+j;
}//for j
}//for i
53
Exemple 2 (4/4)
// affichage
for (int i=0;i<noms.Length;i++)
{
for(int j=0;j<noms[i].Length;j++)
{
Console.Out.WriteLine("noms["+i+"]["+j+"]="+noms[i][j]);
}//for j
}//for i
}//Main
}//class
54
Exécution de l’exemple
entiers[0]=0
entiers[1]=10
entiers[2]=20
entiers[3]=30
reels[0,0]=0.5
reels[0,1]=1.7
reels[1,0]=8.4
reels[1,1]=-6
noms[0][0]=nom00
noms[1][0]=nom10
noms[1][1]=nom11
noms[2][0]=nom20
noms[2][1]=nom21
noms[2][2]=nom22
55
Les énumérations
56
Les énumérations
De façon interne, ces cinq constantes sont codées par des entiers
consécutifs commençant par 0 pour la première constante, 1 pour la
suivante, etc...
Une variable peut être déclarée comme prenant ces valeurs dans
l'énumération :
Exemples :
1. Mentions maMention = Mentions.Passable;
2. if (maMention == Mentions.Passable) { Console.WriteLine("Peut
mieux faire");}
57
Les énumérations
58
Les structures
Exemple:
public struct Employee
{
59
Les structures
Les structure partagent presque tous la même syntaxe que les classes, bien
qu'ils soient plus limités que ces dernières :
Les structures sont des types valeur et les classes des types référence.
60
Les structures
Contrairement aux classes, les objets de type struct peuvent être
instanciés sans recours à l'opérateur new.
Une structure peut être utilisé comme un type Nullable et peut se voir
assigner une valeur Null.
61
Les structures
Exemple
public struct CoOrds
{
public int x, y; Résultat de l’exemple
public CoOrds(int p1, int p2)
{
x = p1; CoOrds 1 : x= 0, y=0
y = p2;
} CoOrds 2 : x=10, y=10
}
// Usage of struct objects.
class TestCoOrds
{
static void Main()
{
// Initialize:
CoOrds coords1 = new CoOrds();
CoOrds coords2 = new CoOrds(10, 10);
// Display results:
Console.Write("CoOrds 1: ");
Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
Console.Write("CoOrds 2: ");
Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
// Keep the console window open in debug mode. Console.WriteLine("Press
any key to exit.");
Console.ReadKey();
}
}
62
Les structures
Cet exemple montre une caractéristique propre aux structures. Il crée
un objet CoOrds sans utiliser l'opérateur new.
Si vous remplacez le mot struct par le mot class, le programme ne peut
pas se compiler.
// Declare a struct object without « new »
class TestCoOrdsNoNew
{
Résultat de l’exemple
static void Main()
{
// Declare an object: CoOrds 1 : x= 10, y=20
CoOrds coords1;
// Initialize:
coords1.x = 10;
coords1.y = 20;
// Display results:
Console.Write("CoOrds 1: ");
Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
63
Les opérateurs
Opérateur d’affectation:
Forme générale : V1=V2=....=Vn=expression
Expression arithmétique
Les opérateurs des expressions arithmétiques sont les suivants :
+ addition
- soustraction
* multiplication
/ division : le résultat est le quotient exact si l'un au moins des
opérandes est réel. Si les deux opérandes sont entiers le résultat
est le quotient entier. Ainsi 5/2 -> 2 et 5.0/2 ->2.5.
% division : le résultat est le reste quelque soit la nature des
opérandes, le quotient étant lui entier. C'est donc l'opération
modulo.
64
Exemple
class Binary
{
public static void Main()
{
int x, y, result;
float floatResult;
x = 7; y = 5;
Exécution de l’exemple
result = x + y; x+y: 12
Console.WriteLine("x+y:{0}", result); x-y: 2
result = x - y; x*y: 35
Console.WriteLine("x-y:{0}", result);
result = x * y; x/y: 1
Console.WriteLine("x*y:{0}", result); x/y: 1.4
result = x / y; x%y: 2
Console.WriteLine("x/y:{0}", result);
floatresult = (float)x / (float)y;
result+=x: 9
Console.WriteLine("x/y:{0}", floatresult);
result = x % y;
Console.WriteLine("x%y:{0}", result);
result += x;
Console.WriteLine("result+=x:{0}", result);
}
}
65
Les opérateurs
66
Les opérateurs
Toutes ces fonctions sont définies dans une classe C# appelée Math.
Lorsqu'on les utilise, il faut les préfixer avec le nom de la classe où elles
sont définies.
Ainsi on écrira :
double x, y=4;
x=Math.Sqrt(y);
67
Les opérateurs
Priorités dans l'évaluation des expressions arithmétiques :
La priorité des opérateurs lors de l'évaluation d'une expression
arithmétique est la suivante (du plus prioritaire au moins prioritaire) :
[fonctions], [ ( )],[ *, /, %], [+, -]
Remarque :
Les opérateurs d'un même bloc [ ] ont même priorité.
68
Les opérateurs
Opérateurs relationnels:
<, <=, ==, !=, >, >=
Priorités:
1. >, >=, <, <=
2. ==, !=
Exemple :
boolean fin;
int x=1;
fin=x>4;
69
Les opérateurs
Comparaison de deux caractères:
Il est possible de comparer deux caractères avec les opérateurs
relationnels.
Ce sont alors leurs codes ASCII, qui sont des nombres, qui sont alors
comparés.
On rappelle que selon l'ordre ASCII on a les relations suivantes :
espace < .. < '0' < '1' < .. < '9' < .. < 'A' < 'B' < .. < 'Z' < .. < 'a' < 'b' <
.. <'z'
70
Les opérateurs
Opérateurs booléens:
NOT ( ! )
AND ( && )
OR ( || )
Exemple:
bool fin;
int x;
fin= x>2 && x<4;
Les opérateurs relationnels ont priorité sur les opérateurs && et ||.
71
Les opérateurs
Opérateurs de traitement de bits:
72
Les opérateurs
Combinaison d'opérateurs:
a=a+b peut s'écrire a+=b
a=a-b peut s'écrire a-=b
Opérateurs d'incrémentation et de décrémentation:
La notation variable++ signifie
variable=variable+1 ou encore variable+=1
La notation variable-- signifie
variable=variable-1 ou encore variable-=1.
73
Les opérateurs
L'opérateur ternaire « ? »
L'expression expr_cond ? expr1:expr2 est évaluée de la façon
suivante :
1. l'expression expr_cond est évaluée. C'est une expression
conditionnelle à valeur vrai ou faux
2. Si elle est vraie, la valeur de l'expression est celle de expr1. expr2
n'est pas évaluée.
3. Si elle est fausse, c'est l'inverse qui se produit :
la valeur de l'expression est celle de expr2. expr1
n'est pas évaluée.
74
Les opérateurs
Exemple:
L'opération i=(j>4 ? j+1:j-1); affectera à la variable i : j+1 si j>4, j-1
sinon.
C'est la même chose que d'écrire if(j>4) i=j+1;
else i=j-1;mais c'est plus concis.
75
Structures de contrôle
76
Structures de contrôle
Les conditions:
Il existe trois types de conditions:
if/else
switch
L’opérateur ternaire ?:
77
Exemple
78
Structures de contrôle
Les boucles
Il existe quatre types de boucles:
while
do/while
for
foreach
79
Exemple
80
Passage de paramètres à une fonction
Les paramètres déclarés dans la signature d’une fonction sont appelés
paramètres formels.
Lorsqu’on appelle une fonction, on lui passe des variables qui vont être
recopiés dans les paramètres formels pour effectuer le calcul. Ces
variables sont appelés paramètres effectifs.
81
Passage par valeur
82
Exemple
83
Passage par référence
84
Exemple
85
Passage par référence avec le mot clé out
86
Passage par référence avec le mot clé out
87
Exemple
Résultat de l’exemple
88
Deuxieme partie.
Ces membres peuvent être accompagnés de l'un des cinq mots clés suivants :
- private n'est accessible que par les seules méthodes internes de la classe.
- public est accessible par toute fonction définie ou non au sein de la classe.
- protected n'est accessible que par les seules méthodes internes de la classe ou d'un type
dérivé de cette classe (voir ultérieurement le concept d'héritage).
- internal est accessible depuis l'assembly en cours uniquement.
- protected internal est accessible depuis l'assembly en cours ou depuis des types
dérivés de cette classe.
En général, les données d'une classe sont déclarées privées alors que ses
méthodes et propriétés sont déclarées publiques.
Les membres statiques de classe
On utilise des méthodes statiques, appelées directement sur la classe, pour modifier
les attributs statiques.
Exemple :
public class UnExemple {
int numero; // Défini pour chaque objet
static int numero_suivant; // Défini pour la classe
}
....
Console.WriteLine("N° suivant = " + UnExemple.numero_suivant );
// pour accéder à un membre static: NomDeLaClasse.MembreStatic
Console.WriteLine("N° = " + UnExemple.numero );
// Erreur de compilation, car la variable n'est pas définie pour la
classe
UnExemple InstanceDUnExemple = new UnExemple();
Console.WriteLine("N° = " + InstanceDUnExemple.numero_suivant);
Les classes statiques
Une classe statique ne contient que des membres statiques, et ne peut être
instanciée. Le mot clé static précède la déclaration de cette classe.
Exemple :
95
Les propriétés
get {...}
set {...}
96
Les propriétés
97
Les indexeurs
98
Les 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.
99
Les indexeurs
Exemple :
Déclaration :
class clA {
Utilisation :
101
Les délégués
102
Les délégués
Les délégués sont utiles pour la gestion des événements. Ils sont déclarés
d’une manière similaire aux fonctions :
• Mot-clé : delegate
• Sans corps de fonction
• Un type de retour et une liste de paramètres
On peut déclarer une variable avec le type délégué. Cette variable sera
initialisée comme une référence à toute fonction qui a le même type de
retour et la même liste de paramètres que le délégué.
103
Les délégués
Exemple :
Ici le délégué peut être utilisé pour référencer toute méthode comportant
un seul paramètre de type string et renvoyant une variable de type int.
104
Les délégués
Une fois qu’un type de délégué est déclaré, un objet délégué doit être
105
Les délégués
Exemple (1/3) :
using System;
namespace Test{
106
Les délégués
Exemple (2/3) :
107
Les délégués
Exemple (3/3) :
Résultat:
La valeur de N est : 14
La valeur de N est : 12
109
Les événements
110
Les événements
112
Utilisation des événements
113
Utilisation des événements
Exemple 1 (1/2):
using System;
namespace SampleApp {
class EventProgram {
// Declarer un événement en utilisant le délégué
public event MyDel MyEvent;
// Constructeur
public EventProgram() {
this.MyEvent += new MyDel(this.WelcomeUser);
}
// Méthode à exécuter
public string WelcomeUser(string username) {
return "Welcome " + username;
114
}
Utilisation des événements
Exemple 1 (2/2):
Results :
Welcome Ensa
115
Utilisation des événements
Exemple 2 (1/3):
116
Utilisation des événements
Exemple 2 (2/3):
117
Utilisation des événements
Exemple 2 (3/3):
118
Création initialisation et affectation des objets
Création
C# fournit un constructeur par défaut
Ce constructeur permet la création de nouveaux objets
On pourra définir ses propres constructeurs.
Initialisation
l ’initialisation doit être prévue par le constructeur de la classe.
Affectation
Par défaut, l ’affectation de 2 objets de même type correspond à une simple
recopie des valeurs des données membres à membres
Constructeur d’une classe
120
Auto-référence : le pointeur this
Le mot réservé this désigne un pointeur, implicitement déclaré, sur l ’objet lui-
même (auto-référence)
Il peut être utilise dans n ’importe quelle fonction membre et constitue un alias
de l ’objet
Exemple :
class point {
int x,y
public void initialise(int x , int y)
{
this.x=x;
this.y=y;
}
};
Notion de constructeur
Un constructeur est une fonction membre qui permet de dégager l’utilisateur des
tâches d ’allocation/initialisation.
Propriétés d ’un constructeur :
porte toujours le même nom que la classe
ne renvoie pas de valeur de retour (même pas un void)
garantit que l ’objet sera toujours initialisé.
class Point
{ int x,y
public point() {x = 20; y = 10;}
void deplace(int dx , int dy) {x = x+dx; y = y+dy;}
void affiche() {Console.WriteLine("x={0}, y={1}", x, y);}
};
class Program
{ static void Main(string[] args)
{
Point a=new Point();
Point b=new Point(); // les deux points sont initialisés en 20,10
a.affiche(); a.deplace(17,10); a.affiche();
Console.ReadKey(); }}
Constructeur d’une classe
Exemple 2
public class personne {
// attributs
private string prenom;
private string nom;
private int age;
// méthode d’initialisation : constructeur
public personne(string P, string N, int age){
prenom=P;
nom=N;
this.age=age;
}/
/ méthode
public void identifie(){
Console.Out.WriteLine(prenom+","+nom+","+age);
}
}
123
Constructeur d’une classe
124
Constructeur d’une classe
Exemple 3
using System;
public class Personne{
// attributs
private string prenom;
private string nom;
private int age;
// constructeur par défaut
public Personne()
{
this.prenom= "";
this.nom="";
this.age=0;
}
125
Constructeur d’une classe
Exemple 3
// constructeur paramétré
public Personne(String P, String N, int age){
this.prenom=P;
this.nom=N;
this.age=age;
} // constructeur par recopie
public Personne(personne P){
prenom=P.prenom;
nom=P.nom;
this.age=P.age
} // méthode
public void identifie(){
Console.Out.WriteLine(prenom+","+nom+","+age);
}
}
126
Constructeur d’une classe
127
Passage de paramètres de type référence d'objet par
valeur et par référence
class P12 {
public static void Main() {
Console.WriteLine("Dans fonction appelante avant appel : sb0={0}, sb1={1}, sb2={2}", sb0,sb1, sb2);
Console.WriteLine("Dans fonction appelante après appel : sb0={0}, sb1={1}, sb2={2}, sb3={3}", sb0,
sb1, sb2, sb3);
}
private static void ChangeStringBuilder(StringBuilder sbf0, StringBuilder sbf1, ref StringBuilder sbf2,
out StringBuilder sbf3) {
sbf0.Append("*****");
sbf1 = new StringBuilder("essai1*****");
sbf2 = new StringBuilder("essai2*****");
sbf3 = new StringBuilder("essai3*****");
Résultat d’exécution:
129
Surcharge des opérateurs
130
Surcharge des opérateurs
Exemple :
using System;
class Personne
{
…..public static bool operator == (Personnep1, Personnep2)
{ if ((p1.nom == p2.nom) && (p1.age == p2.age))
{return true;}
else{return false;
}
}
131
Surcharge des opérateurs
132
Surcharge des opérateurs
133
L’héritage
135
L’héritage
Appels aux constructeurs de la classe de base :
Un constructeur de la classe dérivé peut utiliser le mot clé « base » pour
appeler le constructeur d’une classe de base.
le constructeur de la classe de base est appelé avant que le bloc du
constructeur de la classe dérivé ne soit exécuté.
Exemple :
136
L’héritage
using System;
public class etudiant: personne {
// attributs
private CNE;
// constructeur
public etudiant(string P, string N, int age,int CNE) : base(P,N,age) {
this.CNE=CNE;
// suivi
Console.Out.WriteLine("Construction etudiant(string,string,int,int)");
}//constructeur
// propriété CNE
public CNE{
get { return CNE; }
set { CNE=value; }
}// CNE
}//classe
138
Redéfinition de méthodes et de propriétés
139
Redéfinition de méthodes
140
Redéfinition de méthodes
et/ou
141
Redéfinition de méthodes
142
Redéfinition de méthodes
Donc en C#, des mot clés comme virtual et override sont nécessaires pour
la redéfinition des méthodes.
143
Liaison statique et masquage
class A {
public void P( int x, int y ){ }
private void Q( string a, string b, string c ){ }
protected void R( ){ }
}
144
Liaison statique et masquage
Si vous déclarez dans une classe dérivée de la classe de base A, une méthode
ayant le même nom qu'une méthode à liaison statique de la classe de base, la
nouvelle méthode remplace simplement la méthode héritée dans la classe
dérivée.
Dans ce cas nous emploierons aussi le mot de masquage qui semble être
utilisé pour dénommer ce remplacement, car il correspond bien à l'idée d'un
masquage "local" dans la classe fille du code de la méthode de la classe
parent par le code de la méthode fille.
145
Liaison statique et masquage
Exemple :
// Classe Fille
// Classe Mère public class Automobile : Vehicule
public class Vehicule {
{ private string couleur;
private int poids;
// Constructeur
// Constructeur public Automobile(int poids,string
public Vehicule(int poids) couleur) : base(poids)
{ this.poids = poids; } { this.couleur = couleur; }
Exemple :
// Classe Fille
// Classe Mère public class Automobile : Vehicule
public class Vehicule {
{ private string couleur;
Le compilateur génère un avertissement
private int poids;
(warning CS0108) dans la classe dérivée.
// Constructeur
public Automobile(int poids,string
// Constructeur Il faut spécifier que l'on redéfinit une
public Vehicule(int poids) couleur) : base(poids)
méthode, en utilisant le mot clé new
{ this.poids = poids; } { this.couleur = couleur; }
// Classe Fille
public class Automobile : Vehicule
{
private string couleur;
// Constructeur
public Automobile(int poids,string couleur) : base(poids)
{ this.couleur = couleur; }
148
Liaison statique et masquage
Résultat :
Véhicule de 3 tonnes de couleur rouge Le masquage
Véhicule de 3 tonnes La méthode appelée est celle de la classe mère.
Que fait alors le compilateur C# dans ce cas ? il
réalise une liaison statique.
149
Liaison statique et masquage
150
Liaison statique et masquage
Le compilateur se base sur le type de la référence plutôt que sur le type
réel de l'objet référencé.
Console.WriteLine( ((Automobile)vehicule).Description());
151
Liaison dynamique
152
Liaison dynamique
La méthode à redéfinir doit être déclarée avec le mot-clé virtual, dans la
première classe de base qui l’implémente, et;
153
Liaison dynamique
Exemple :
// Classe Fille
// Classe Mère public class Automobile : Vehicule
public class Vehicule {
{ private string couleur;
private int poids;
// Constructeur
// Constructeur public Automobile(int poids,string
public Vehicule(int poids) couleur) : base(poids)
{ this.poids = poids; } { this.couleur = couleur; }
Résultat :
Véhicule de 3 tonnes de couleur rouge La liaison dynamique.
155
Liaison dynamique
Exemple :
Une classe de base Employe et deux classes dérivées Technicien et Secretaire.
156
Liaison dynamique
157
Liaison dynamique
158
Liaison dynamique
159
Liaison dynamique
class Program{
static void Main()
{
Employe[] tableau = new Employe[3];
tableau[0] = new Technicien("Line");
tableau[1] = new Secretaire("Lisanette");
tableau[2] = new Secretaire("Anne-Mette");
foreach (Employe employe in tableau)
employe.DisplayDescription();
}
}
class A { }
sealed class B : A { }
class C : B { } // Error : ‘C': cannot derive from sealed type ‘B'
161
Classes et méthodes « sealed »
Lorsqu’il est utilisé avec une méthode ou une propriété, le mot clé
« sealed » doit être toujours combiné avec le mot clé « override ».
162
Classes et méthodes « sealed »
Exemple:
class X
{
protected virtual void F() { Console.WriteLine("X.F"); }
protected virtual void F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealed protected override void F() { Console.WriteLine("Y.F");}
protected override void F2() { Console.WriteLine("Y.F2"); }
}
class Z : Y
{
// Error CS0239 :’Z.F()’ Impossible de substituer le membre
hérité ‘Y.F()’ car il est sealed .
protected override void F() { Console.WriteLine("Z.F"); }
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
163
Abstraction
Une classe abstraite est une classe qui doit déléguer complètement
l’implémentation de certaines de ces méthodes à ses classes dérivées.
164
Abstraction
Si une classe dérivée d’une classe abstraite n’implémente pas toutes les
méthodes abstraites, elle est elle-même abstraite.
Le polymorphisme est plus évident lorsqu’il est utilisé sur des méthodes
abstraites.
Exemple :
- Une classe de base abstraite Figure Geometrique,
- Deux classes dérivée Cercle et Triangle,
- Un traitement de base qui est de dessiner la figure.
class Point
{
public Point (int x,int y){
this.x = x;this.y = y;
}
int x ; int y ;
}
166
Abstraction
167
Abstraction
168
Abstraction
class Program{
static void Main(){
FigureGeometrique[] tableau = new FigureGeometrique[3];
tableau[0] = new Cercle(new Point(0, 0), 3.2);
tableau[1] = new triangle(
new Point(0, 0), new Point(0, 2), new Point(1, 2));
tableau[2] = new Cercle(new Point(1, 1), 4.1);
// Le polymorphisme s’applique `a l’appel
// de la methode abstraite Dessine().
foreach (FigureGeometrique f in tableau)
f.Dessine();
}
} Remarque : on ne peut pas écrire cette instruction
FigureGeometrique fig = new FigureGeometrique();
Une classe abstraite n’est pas instanciable
169
Interfaces
170
Interfaces
// Propriétés à implémenter :
string UneProprieteAImplementer {get; set;}
string UneProprieteLectureSeuleAImplementer {get;}
// Evénements à implémenter
event PageRecueDelagate PageRecue {add; remove;}
}
171
Implémentation de l’interface
class MaClasse:IMonInterface
{
// implémentation de la classe
}
172
Implémentation de l’interface
173
Implémentation de l’interface
Exemple (1/4) :
interface IPoint
{
// Propriétés :
int MonX
{
get; set;
}
int MonY
{
get; set;
}
}
174
Implémentation de l’interface
Exemple (2/4) :
class Point : IPoint
{
// Champs:
private int x;
private int y;
// Constructeur:
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
175
Implémentation de l’interface
Exemple (3/4) :
// implementation des propriétés :
public int MonX
{
get { return x; }
set { x = value; }
}
public int MonY
{
get { return y; }
set { y = value; }
}
public static void AfficherMonPoint(IPoint monPoint)
{
Console.WriteLine("({0},{1})", monPoint.MonX,
monPoint.MonY);
}
} 176
Implémentation de l’interface
Exemple (4/4) :
class MaClasse
{
static void Main()
{
Point monPoint = new Point(12, 300);
Console.Write("Mon point est créé avec les
coordonnées: ");
Point.AfficherMonPoint(monPoint);
}
}
177
Implémentation d’interface explicite
Par exemple :
interface IControl
{
void Paint();
}
interface ISurface
{
void Paint();
}
class SampleClass : IControl, ISurface
{
// ISurface et IControl contiennent la même méthode
Paint
Public void Paint()
{
}
}
178
Implémentation d’interface explicite
179
Implémentation d’interface explicite
180
Implémentation d’interface explicite
interface ILeft
{
int P ( get;)
}
interface IRight
{
int P ();
}
class Middle : ILeft, IRight
{
int P() { return 0;}
int Ileft.P { get { return 0;}}
}
182
Utiliser « is » pour tester les types
Usage :
expression is type
où:
type est une référence à un type
Expression est l’objet à tester
183
Utiliser « is » pour tester les types
Exemple (1/2):
interface I1{
}
interface I2{
}
class Class1 : I1, I2{
}
class MaClasse
{
static bool TesterType(object obj)
{
if (obj is I1 & obj is I2 & obj is Class1)
return true;
else
return false;
}
184
Utiliser « is » pour tester les types
Exemple (2/2):
185
La gestion des exceptions
186
La gestion des exceptions
187
La gestion des exceptions
188
La gestion des exceptions
Si le code de la clause try est susceptible de générer plusieurs types
d'exceptions, on peut vouloir être plus précis en gérant l'exception avec
plusieurs clauses catch :
try {
appel de la fonction susceptible de générer
l'exception
} catch (IOException e){
traiter l'exception e
}
} catch (SystemException e){
traiter l'exception e
}
instruction suivante
189
La gestion des exceptions
190
La gestion des exceptions
191
Exemple 1
using System;
public class Prog
{
public static void Main()
{
try
{
int i = 1;
int j = 0;
int k = i/j;
}
catch(System.DivideByZeroException)
{
Console.WriteLine("Une division entière par zéro a eu lieu!");
}
}
}
192
Exemple 2
193
Exemple 2
194
Résultat de l’exemple
tab[0]=0
tab[1]=1
tab[2]=2
tab[3]=3
0
1
2
3
L'erreur suivante s'est produite : Index was outside the bounds of the array.
195
Exemple 3
class Program
{
static void Main(string[] args){
// On demande le nom
Console.Write("Nom : ");
// lecture réponse
string nom = Console.ReadLine();
// on demande l'âge
int age = 0;
bool ageOK = false;
while (!ageOK) {
// question
Console.Write("âge : ");
// lecture-vérification réponse
try {
age = int.Parse(Console.ReadLine());
ageOK = age>=1;
} catch {
}//try-catch
if (!ageOK) {
Console.WriteLine("Age incorrect, recommencez...");
}
}//while
// affichage final
Console.WriteLine("Vous vous appelez {0} et vous avez {1} an(s)",nom,age);
}} 196
Exemple 3
class Program
{ Résultat de l’exemple
static void Main(string[] args){
// On demande le nom Nom : Sara
Console.Write("Nom : ");
âge : 23
// lecture réponse
string nom = Console.ReadLine(); Vous vous appelez Sara et
// on demande l'âge vous avez 23 an(s)
int age = 0;
bool ageOK = false;
while (!ageOK) {
Nom : Ahmed
// question âge : x
Console.Write("âge : "); Age incorrect, recommencez...
// lecture-vérification réponse
âge : -4
try {
age = int.Parse(Console.ReadLine()); Age incorrect, recommencez...
ageOK = age>=1; âge : 12
} catch { Vous vous appelez Ahmed et
}//try-catch
if (!ageOK) {
vous avez 12 an(s)
Console.WriteLine("Age incorrect, recommencez...");
}
}//while
// affichage final
Console.WriteLine("Vous vous appelez {0} et vous avez {1} an(s)",nom,age);
}} 197
Exemple 4
//espace de noms importés
Using System;
//La classe de test
namespace Test1
{
class Program
{
static void Main(string[] args)
{ string s;
const int i = 10;
const long l = 10000;
const float f = 45.78F;
double d = -14.98;
//Nombrechaine
s = "" + i;
Console.WriteLine(s);
s = "" + l;
Console.WriteLine(s);
s = "" + f;
Console.WriteLine(s);
s = "" + d;
Console.WriteLine(s);
198
Exemple 4
//Boolean-->chaine
const bool b = false;
s = "" + b;
Console.WriteLine(s);
//chaine-->int
int i1;
i1 = int.Parse("10");
Console.WriteLine("" + i1);
try
{ i1 = int.Parse("10.67");
Console.WriteLine("" + i1); }
catch(Exception e)
{ Console.WriteLine("Erreur"+e.Message); }
//chaine-->long
long l1;
l1=long.Parse("100");
Console.WriteLine(""+l1);
try
{
l1=long.Parse("10.675");
Console.WriteLine(""+l1);
}
catch(Exception e)
{
Console.WriteLine(" Erreur"+e.Message); }
199
Exemple 4
//Chaine-->double
double d1;
d1=double.Parse("100,87");
Console.WriteLine("" + d1);
try
{ d1 = double.Parse("abcd");
Console.WriteLine("" + d1); }
catch (Exception e)
{ Console.WriteLine("Erreur" + e.Message); }
//Chaine --> float
float f1;
f1 = float.Parse("100,87");
Console.WriteLine ("" + f1);
try
{
d1 = float.Parse("abcd");
Console.WriteLine("" + f1);
}
catch (Exception e)
{ Console.WriteLine("Erreur" + e.Message); }
Console.ReadKey();
}
}
}
200
Exécution de l’exemple 4
201
Troisième partie.
203
L’espace de noms System.Windows.Forms
204
Formulaire
using System;
using System.Drawing;
using System.Windows.Forms;
// la classe formulaire
public class Form1 : Form {
// le constructeur
public Form1() {
// titre de la fenêtre
this.Text = "Mon premier formulaire";
// dimensions de la fenêtre
this.Size=new
System.Drawing.Size(300,100);
}//constructeur
// fonction de test
public static void Main(string[] args) {
// on affiche le formulaire
Application.Run(new Form1());
}
}//classe
205
Un formulaire avec bouton
using System;
using System.Drawing;
using System.Windows.Forms;
// la classe formulaire
public class Form1 : Form {
// attributs
Button cmdTest;
// le constructeur
public Form1() {
// le titre
this.Text = "Mon premier formulaire";
// les dimensions
this.Size=new System.Drawing.Size(300,100);
206
Un formulaire avec bouton
// création bouton
this.cmdTest = new Button();
// position bouton
cmdTest.Location = new
System.Drawing.Point(110, 20);
// taille bouton
cmdTest.Size = new System.Drawing.Size(80,30);
207
Un formulaire avec bouton
// libellé
cmdTest.Text = "Test";
// gestionnaire d'évt
cmdTest.Click += new System.EventHandler(cmdTest_Click);
// ajout bouton au formulaire
this.Controls.Add(cmdTest);
}//constructeur
// gestionnaire d'événement
private void cmdTest_Click(object sender, EventArgs evt){
// il y a eu un clic sur le bouton - on le dit
208
Un formulaire avec bouton
}//cmdTest_Click
// fonction de test
public static void Main(string[] args) {
// on affiche le formulaire
Application.Run(new Form1());
}
}//classe
209
Un formulaire avec bouton
210
Un formulaire avec bouton
211
Un formulaire avec bouton
212
La classe MessageBox
avec:
• text le message à afficher
• caption le titre de la fenêtre
• buttons les boutons présents dans la fenêtre
• icon l'icône présente dans la fenêtre
213
Un formulaire avec bouton
214
Un formulaire avec bouton
215
Applications Windows
216
Applications Windows
217
Applications Windows
Tout autre travail à faire dans le constructeur peut être fait après l'appel
à InitializeComponent. La méthode InitializeComponent
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "Form1";
}
fixe le titre de la fenêtre "Form1", sa largeur (300) et sa hauteur (300).
Le titre de la fenêtre est fixée par la propriété Text.
et les dimensions par la propriété Size. Size est défini dans l'espace de
noms System.Drawing et est une structure.
219
Applications Windows
220
Le formulaire Form
221
Le formulaire Form
Nous traitons les trois événements précédents :
224
Étiquettes Label et boîtes de saisie TextBox
225
Étiquettes Label et boîtes de saisie TextBox
227
Étiquettes Label et boîtes de saisie TextBox
228
Étiquettes Label et boîtes de saisie TextBox
229
listes déroulantes ComboBox
230
listes déroulantes ComboBox
231
listes déroulantes ComboBox
232
listes déroulantes ComboBox
Soit C un combo et C.Items sa liste d'éléments. On a les propriétés
suivantes:
C.Items.Count nombre d'éléments du combo
C.Items[i] élément i du combo
C.Add(object o) ajoute l'objet o en dernier élement du combo
C.AddRange(object[] objets) ajoute un tableau d'objets en fin de combo
C.Insert(int i, object o) ajoute l'objet o en position i du combo
C.RemoveAt(int i) enlève l'élément i du combo
C.Remove(object o) enlève l'objet o du combo
C.Clear() supprime tous les éléments du combo
C.IndexOf(object o) rend la position i de l'objet o dans le combo
234
listes déroulantes ComboBox
235
listes déroulantes ComboBox
236
composant ListBox
On se propose de construire l'interface suivante:
237
composant ListBox
238
composant ListBox
Les boutons sont allumés ou éteints selon les règles suivantes :
le bouton Ajouter n'est allumé que s'il y a un texte non vide dans le
champ de saisie
le bouton 5 de transfert de la liste 1 vers la liste 2 n'est allumé que s'il
y a un élément sélectionné dans la liste 1 le bouton 6 de transfert de
la liste 2 vers la liste 1 n'est allumé que s'il y a un élément sélectionné
dans la liste 2
les boutons 7 et 8 d'effacement des listes 1 et 2 ne sont allumés que si
la liste à effacer contient des éléments.
Dans les conditions précédentes, tous les boutons doivent être éteints lors
du démarrage de l'application.
C'est la propriété Enabled des boutons qu'il faut alors positionner à false.
On peut le faire au moment de la conception ce qui aura pour effet de
générer le code correspondant dans la méthode InitializeComponent ou
de le faire nous-mêmes dans le constructeur comme ci-dessous :
239
composant ListBox
public Form1()
{
// création initiale du formulaire
InitializeComponent();
// initialisations complémentaires
// on inhibe un certain nombre de boutons
btnAjouter.Enabled=false;
btn1TO2.Enabled=false;
btn2TO1.Enabled=false;
btnEffacer1.Enabled=false;
btnEffacer2.Enabled=false;
}
240
composant ListBox
241
composant ListBox
242
composant ListBox
243
composant ListBox
On notera la méthode Focus qui permet de mettre le "focus" sur un
contrôle du formulaire.
Le code associé au clic sur les boutons Effacer :
244
composant ListBox
245
composant ListBox
private void btn2TO1_Click(object sender, System.EventArgs e)
{
// transfert de l'élément sélectionné dans Liste 2 vers Liste 1
transfert(listBox2,listBox1);
// boutons Effacer
btnEffacer1.Enabled=true;
btnEffacer2.Enabled=listBox2.Items.Count!=0;
// boutons de transfert
btn1TO2.Enabled=false;
btn2TO1.Enabled=false;
}
// transfert
private void transfert(ListBox l1, ListBox l2){
// transfert de l'élément sélectionné de la liste l1 vers la liste l2
// un élément sélectionné ?
if(l1.SelectedIndex==-1) return;
// ajout dans l2
l2.Items.Add(l1.SelectedItem);
// suppression dans l1
l1.Items.RemoveAt(l1.SelectedIndex);
} 246
composant ListBox
System.Windows.Forms.ColorDialog
System.Windows.Forms.FileDialog
System.Windows.Forms.FontDialog
System.Windows.Forms.OpenFileDialog
System.Windows.Forms.PageSetupDialog
System.Windows.Forms.PrintControllerWithStatusDialog
System.Windows.Forms.PrintDialog
System.Windows.Forms.PrintPreviewDialog
System.Windows.Forms.SaveFileDialog
248