Upload
ismahaneissou
View
250
Download
0
Embed Size (px)
Citation preview
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 1/195
Support de Cours
Visual C# 2.0
proposé par Nadia HADDOUCHE epse CHETTA
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 2/195
Part 1: Introduction àVisual C# et Visual
Studio 2005
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 3/195
Chapitre 1: Bienvenue àVisual C#
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 4/195
Quelle est la structure d’un programme C# ?
L’exécution du programme commence à Main( )
Le mot clé using fait référence aux ressources dans lalibrairie des classes de .NET Framework
Un programme est composé d’instructions
Les instructions sont séparées par des « ; »
Les { } sont utilisées pour grouper les instructions
using System;using System.Collections.Generic;using System.Text;
namespace TextHello {class Program {
static void Main(string[ ] args) {Console.WriteLine("Hello World");
}}
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 5/195
Comment formater le Code en C#
Utiliser l’indentation C# est case sensitive
Les espaces blancs sont ignorés
Une ligne de commentaire est indiquée par // Des lignes de commentaire sont limitées par /* et */using System;using System.Collections.Generic;using System.Text;
namespace TextHello {class Program {
static void Main(string[ ] args) {Console.WriteLine("Hello World");
}}
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 6/195
L’utilisation les noms d’espace : Namespaces
Déclarer un namespace
namespace CompanyName {namespace Sales {
public class Customer () { }}
}
// Ornamespace CompanyName.Sales { ... }
La déclaration using using System;using CompanyName.Sales;
Namespaces imbriqués
namespace CompanyName {public class Customer () { }
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 7/195
Chapitre 2: Utiliser lesvariables, les opérateurs
et les expressions
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 8/195
Les mots clé de C#
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 9/195
Qu’est un type prédéfini?
Les Types sont utilisés pour définir des variables Les Variables stockent différent types de données
Les types prédéfinis sont ceux définis par C# et le .NET
Framework Vous pouvez définir les votre
Les Variables doivent être définies avant de les utiliser
Utiliser la camelCase convention pour nommer lesvariables
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 10/195
Les types prédéfinis de C#
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 11/195
Comment déclarer et initialiser des variables
Déclaration Affecter un type
Affecter un nom
Terminer par un ;
int numberOfVisitors;
Initialisation Utiliser l’opérateur “=“
Affecter une valeur
Terminer par un ;
1
2
3
1
2
3
Affecter des valeurs litérales Ajouter un suffixe de type1
decimal deposit = 100M;
string bear;
string bear = "Grizzly";
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 12/195
Comment déclarer et initialiser des chaînes decaractères
Exemple de chaîne de caractère
Déclarer une chaîne entre guillemets
Utiliser un retour chariot
Utiliser des verbatim strings
Utiliser la codification de caractères Unicode
string s = "Hello World"; // Hello World
string s = "Hello\nWorld"; // une ligne est ajoutée
string s = @"Hello\n"; // Hello\n
string s = "\"Hello\""; // "Hello"
Le caractère “A” est représenté par “U+0041”
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 13/195
Comment créer et déclarer des Constantes
Déclarée en utilisant le mot clé const et un type Sa valeur est affectée au moment de la déclaration
const int earthRadius = 6378;//km
const long meanDistanceToSun = 149600000;//km
const double meanOrbitalVelocity = 29.79D;//km sec
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 14/195
Comment faire des conversions entre types
Implicite
Effectué par le compilateur sur des opérations qui netronquent pas l’information
Explicite
Où on demande explicitement au compilateur d’effectuer
une conversion qui peut perdre de l’information
int x = 123456; //int est un entier de 4 bytes
long y = x; //conversion implicite à un long
int x = 65537;short z = (short) x;// conversion explicit à un short, z == 1
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 15/195
Qu’est ce que les Expressions et les Opérateurs?
Les opérateurs sont des Symboles utilisés dans les Expressions
Opérateurs communs
• Incrémenter/décrémenter
• Arithmétique
• Relationnel
• Egalité
• Conditionnel• Affectation
Exemple
++ --
* / % + -
< > <= >=
== !=
&& || ?:= *= /= %= += -= <<=
>>= &= ^= |=
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 16/195
Comment déterminer l’ordre de priorité desopérateurs ?
Les expressions sont évaluées selon l’ordre de priorité des
opérateurs
Les parenthèses peuvent être utilisées pour contrôler l’ordred’évaluation
l’ordre de priorité des opérateurs est aussi déterminé par
associativité Les opérateurs binaires sont associatifs à gauche
L’affectation et les opérateurs conditionnels sont are associatifs àdroite
(10 + 20) / 5 le résultat est 610 + (20 / 5) le résultat est 14
10 + 20 / 5 le résultat est 14
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 17/195
Chapitre 3: Ecrire desméthodes
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 18/195
Déclarer d’une méthode
La syntaxe d’une méthode avec Microsoft Visual C# est :
returnType methodName ( parameterList ) {
// … le corps de la méthode
}
Exemple
int addValues(int leftHandSide, int rightHandSide) {
// ...
return leftHandSide + rightHandSide; }
void showResult(int answer) {
// ... le corps de la méthode
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 19/195
Appeler une méthode
Une méthode est appelée par son suivi d’une listed’argument.
result = addValues(39, 3); // à droite d’une affectation
showResult(addValues(39, 3)); // comme argument pour appeler une autre méthode.
Il faut respecter le type et l’ordre des arguments
addValues; // pas de parenthèsesaddValues(); // pas assez d’argumentsaddValues(39); // pas assez d’argumentsaddValues("39", "3"); // types erronés
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 20/195
Définir la portée locale
class Example {
void firstMethod() {
int myVar;
...}
void anotherMethod() {
myVar = 42; // error – variable not in scope
...}
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 21/195
Définir la portée dans une classe
class Example {
void firstMethod() {
myVar = 45;
...
}void anotherMethod() {
myVar = 42;
...
}
int myVar = 0;
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 22/195
Surcharger une méthode (Overload)
Surcharger une méthode permet de créer plusieursméthodes dans une classe qui ont le même nom maisavec des signatures différentes
static void Main(){Console.WriteLine("The answer is ");Console.WriteLine(42);
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 23/195
Chapitre 4 :les instructionsconditionnelles
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 24/195
Déclarer une variable booléenne
bool areYouReady;areYouReady = true;
Console.WriteLine(areYouReady); // Affichera True .
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 25/195
Les opérateurs d’égalité
Opérateurs
• ==
• !=
Signification
égale
différent
Exemple Résultat si age = 42
age == 100
age != 100
false
true
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 26/195
Les opérateurs relationnels
Opérateurs
• <
• <=• >
• >=
Signification
inférieur
inf ou égalsupérieur
sup ou égal
Exemple Résultat si age = 42
age < 21
age <= 16age > 18
age >= 30
false
truetrue
false
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 27/195
Les opérateurs conditionnels
Opérateurs
• &&
• ||
Signification
et
ou
Exemple
(percent >= 0) && (percent <= 100);
(percent >= 0) || (percent <= 100);
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 28/195
Comment et quand utiliser l’instruction if
if if ( sales > 10000 ) { bonus += .05 * sales;} if ( sales > 10000 ) {
bonus += .05 * sales;}
else {bonus = 0;
}
if else
if else if
if ( sales > 10000 ) { bonus += .05 * sales;
}else if ( sales > 5000 ) {
bonus = .01 * sales;}
else {bonus = 0;if ( priorBonus == 0 ) {
//ScheduleMeeting;}
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 29/195
Comment utiliser l’instruction switch
switch (day){
case 0 : dayName = "Sunday"; break;
case 1 : dayName = "Monday"; break;
case 2 : dayName = "Tuesday"; break;...
default : dayName = "Unknown"; break;
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 30/195
Quand utiliser l’instruction switch
Vous ne pouvez utiliser que des données de typesprimitifs, comme int ou string.
Les étiquettes doivent être des constantes, comme 42ou “42”.
Les étiquettes doivent être uniques.
Lorsque deux étiquettes impliquent le mêmecomportement, il est possible de les regrouper.
Case 1:Case 2: x = 20;
break;
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 31/195
Chapitre 5 :les instructions itératives
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 32/195
Overview
Comment utiliser une boucle for Comment utiliser une boucle while
Comment utiliser une boucle do
Suivre par étapes l’exécution d’une instructionitérative pour voir le changement de valeur desvariables
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 33/195
Utiliser les opérateurs d’affectation composés
Ne pas écrire
• variable = variable * number;
• variable = variable / number;• variable = variable % number;
• variable = variable + number;
• variable = variable - number;
Écrire
• variable *= variable;
• variable /= variable;• variable %= variable;
• variable += variable;
• variable -= variable;
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 34/195
Comment utiliser une boucle while
Un test est effectué au début de la boucle, si le test estFalse, la boucle n’est jamais exécutée
La boucle s’exécute jusqu’à ce que la conditiondevienne fausse
continue, break
bool readingFile;
// . . .
while ( readingFile == true ) {GetNextLine();
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 35/195
Comment utiliser une boucle for
L’utiliser lorsque le nombre d’itérations à exécuter estconnu
for (int i = 0; i < 10; i++) {
Console.WriteLine("i = {0}",i);
}
for ( int j = 100; j > 0; j -= 10 ) {
Console.WriteLine("j = {0}", j);
}
for (initialiseur; condition; itération {
instructions;
}
Exemple
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 36/195
Comment utiliser une boucle for (suite)
for (int i = 0; ;i++) {
Console.WriteLine("somebody stop me!");
}
Exemples
int i = 0;for (; i != 10; ) {
Console.WriteLine(i); i++;}
for (int i = 0, j = 10; i <= j; i++, j--) {...
} //multiple initialisations//multiple mises à jour //une seule expression booléenne
••
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 37/195
La portée d’une instruction for
for (int i = 0; i != 10; i++) {...
}Console.WriteLine(i); // erreur de compilation
Exemples
for (int i = 0; i != 10; i++) {...
}for (int i = 0; i != 20; i += 2) {...} // OK
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 38/195
Comment utiliser une boucle do
Exécuter la boucle puis effectuer le test. Si le résultat estTrue, la boucle se répète jusqu’à ce que l’expressiondevienne False.
do {// instructions qui s’exécuteront au moins
// une fois} while (test est true);
int i = 1;do {Console.WriteLine ("{0}", i++);
} while (i <= 10);
Exemple
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 39/195
Chapitre 6:Gérer les erreurs et les
exceptions
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 40/195
Comment gérer les Exception
La syntaxe pour gérer les exceptions
try {// code suspect
}catch {// gérer les exceptions
}finally {
// toujours exécuter}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 41/195
Comment gérer les Exception
try {int leftHandSide = Int32.Parse(leftHandSideOperand.Text);int rightHandSide = Int32.Parse(rightHandSideOperand.Text);int answer = doCalculation(leftHandSide, rightHandSide);
result.Text = answer.ToString();}catch (FormatException fEx) {
// gérer l’exception
...
}
Exemple
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 42/195
Utiliser plusieurs catch
try {int leftHandSide = Int32.Parse(leftHandSideOperand.Text);int rightHandSide = Int32.Parse(rightHandSideOperand.Text);int answer = doCalculation(leftHandSide, rightHandSide);result.Text = answer.ToString();
}catch (FormatException fEx) {
//...}catch (OverflowException oEx) {
//...}
La première exception qui correspond au problème estexécutée : l’ordre des catch est important
Exemple
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 43/195
Utiliser plusieurs exceptions
Les exceptions sont regroupées en familles et reliées
de façon hiérarchique par la relation d’héritage
try {int leftHandSide = Int32.Parse(leftHandSideOperand.Text);int rightHandSide = Int32.Parse(rightHandSideOperand.Text);
int answer = doCalculation(leftHandSide, rightHandSide);result.Text = answer.ToString();
}catch (Exception ex) {
//...
} // ceci est une exception générale
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 44/195
Gérer les débordements de capacité pour les int
Int32.MinValue et Int32.MaxValue permettent deconnaître les bornes d’un int.
C# ne génère pas d’exceptions en cas de débordementde capacité d’un int (valeur erronée).
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 45/195
Utiliser Checked et Unchecked pour les int
Il est possible d’activer ou de désactiver overflowchecking dans Visual Studio 2005.
Dans le menu Project, cliquer sur LeProjet Properties.
Dans la dialog box project properties, cliquer sur l’onglet Build.
Cliquer sur le bouton Advanced.
Dans la dialog box Advanced Build Settings, cocher ou
décocher “Check for arithmetic overflow/underflow”.
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 46/195
Utiliser Checked et Unchecked pour les int
Il est possible de vérifier le débordement d’un int int number = Int32.MaxValue;
checked {
int willThrow = number++;
Console.WriteLine("this won't be reached");}
int number = Int32.MaxValue;
checked {
int willThrow = number++;Console.WriteLine("this won't be reached");
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 47/195
Ecrire des expressions checked
int wontThrow = unchecked(Int32.MaxValue + 1); int willThrow = checked(Int32.MaxValue + 1);
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 48/195
Déclencher des Exceptions
Utiliser le mot clé Throw Types d’Exception
Les classes d’ exceptions prédéfinies dans le commonlanguage runtime
Exemple: ArithmeticException, FileNotFoundException
Les exceptions définies par l’utilisateur
é
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 49/195
Déclencher des Exceptions
public static string monthName(int month) {switch (month) {
case 1 : return "January";case 2 : return "February";...
case 12 : return "December";default : throw new ArgumentOutOfRangeException("Bad month");
}}
Exemple
Utili l bl fi ll
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 50/195
Utiliser le bloc finally
TextReader reader = null;try {
reader = src.OpenText();string line;while ((line = reader.ReadLine()) != null) {
source.Text += line + "\n";}
}finally {
if (reader != null) {
reader.Close();}
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 51/195
Part II : Comprendre lelangage C#
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 52/195
Chapitre 7 : Créer desclasses et des objets
Q t l l t l bj t ?
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 53/195
Que sont les classes et les objets?
Classe: est comme un négatif pour des objets
Contient des attributs et des méthodes
Objets:
instances d’une classe
Créés en utilisant le motclé new
Impliquent des actions
Objet
kitchen
Living Room
Bath Office
DiningRoom
FamilyRoom
Covered Porch
Classe
C t défi i l t é d bj t
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 54/195
Comment définir une classe et créer des objets
public class Customer {public string name;public decimal creditLimit;public uint customerID;
}
Comment définir une classe
Comment instancier une classe : un objet
Customer nextCustomer = new Customer();
Comment accéder à un attribut de la classe
nextCustomer.name = "Suzan Fine";
L t i XML d d
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 55/195
Le commentaire XML du code
Trois slashes (///) avant la déclaration d’une méthode,insèrent des commentaires XML
Mettre un point juste après le nom d’un objet afficheun pop-up menu pour accéder aux membres de laclasse de l’objet.
Défi i l’ ibilité t l té
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 56/195
Définir l’accessibilité et la portée
Les modificateurs d’accès sont utilisés pour définir leniveau d’accessibilité aux membres d’une classe
Déclaration Définition
publicAccès illimité.
private Accès limité aux méthodes de la classe.
internal Accès limité au programme.
protected Accès limité aux méthodes de la classe et deses classes dérivées
protectedinternal
Accès limité aux méthodes de la classe, desclasses dérivées ou des membres du pgme
C ti
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 57/195
Conventions
Les identificateurs qui sont public commencent par
une majuscule. C’est la PascalCase notation Les identificateurs qui ne sont pas public commencent
par une minuscule. C’est la camelCase notation.
La seule exception à cette règle : une classe peutcommencer par une majuscule et ses constructeursdoivent avoir le même nom que la classe. Dans ce cas,un constructeur qui est private doit commencer par une majuscule.
Initialiser un objet
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 58/195
Initialiser un objet
public class Lion {public Lion() {
Console.WriteLine("Constructing Lion");}
}
Un constructeur d’Instances est une méthode spéciale
qui implémente les actions requises pour initialiser unobjet
Il a le même nom que la classe
Le constructeur par défaut ne prend pas de paramètres
Readonly Utilisée pour affecter une valeur à une variable dans le
constructeur
Surcharger un Constructeur
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 59/195
Surcharger un Constructeur
Créer plusieurs constructeurs qui ont le même nom
mais qui ont des signatures différentes Spécifier un initialiseur avec this
public class Lion {private string name;
private int age;
public Lion() : this( "unknown", 0 ) {Console.WriteLine("Default: {0}", name);
}public Lion( string theName, int theAge ) {
name = theName;age = theAge;Console.WriteLine("Specified: {0}", name);
}}
Les classes partielles
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 60/195
Les classes partielles
C# 2.0 permet de diviser le code source d’une classe
en plusieurs fichiers. Il est possible d’organiser la définition d’une grande
classe en de petits morceaux plus faciles à gérer.
Utiliser le mot clé partial
Pourquoi utiliser les membres de classe Static ?
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 61/195
Pourquoi utiliser les membres de classe Static ?
double d = m.Sqrt(42.24);
class Math{
public static double Sqrt(double d) { ... }...
}
class Circle{
public Circle(){
radius = 0.0;
NumCircles++;}
...private double radius;public static int NumCircles = 0;
}
Utiliser les membres de classe Static
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 62/195
Utiliser les membres de classe Static
Membre Static
Appartient à la classe
Initialisé avant la création d’une instance de la classe
Partagé par toutes les instances de la classe
Ne peut pas être préfixé par this
class Lion {public static string family = "felidae";
}...// un objet Lion n’a pas été créé dans ce code Console.WriteLine( "Family: {0}", Lion.family );
Initialiser une Classe
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 63/195
Initialiser une Classe
Constructeur Static Sera exécuté au plus une fois
Est exécuté avant que le premier objet de cette classene soit créé
N’a pas de paramètres (constructeur par défaut)
Ne prend pas de modificateurs d’accès
Est utilisé pour initialiser une classe
Les classes static
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 64/195
Les classes static
Une classe static ne contient que des membres static. Le but d’une classe static est d’être une conteneur
pour un ensemble de champs et de méthodes.
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 65/195
Chapitre 8 :Comprendre les valeurs
et références
Les value types et les reference types ?
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 66/195
Les value types et les reference types ?
Value Type
Contient directementdes données
Stocké dans la pile
Doit être initialisé
Doit être non null
int est un value type
int i;i = 42; CostObject c;
• 42
Reference Type
Contient une référence à ladonnées
Stocké dans la heap
Déclaré en utilisant new
.NET garbage collector s’occupe de la destruction
class est un reference type
42i c
Copier des variables int et des objets
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 67/195
Copier des variables int et des objets
Passer des paramètres à une méthode
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 68/195
Passer des paramètres à une méthode
class Lion {private int weight;public void SetWeight(int newWeight) {
weight = newWeight;}
}. . .
Lion bigLion = new Lion();
int bigLionWeight = 250;bigLion.SetWeight( bigLionWeight );
Passage par valeur
Passer des Paramètres par référence
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 69/195
Passer des Paramètres par référence
Utiliser le mot clé ref
Affectation définie: Les paramètres passées doiventêtre définis. Utiliser le mot clé out
Permet d’initialiser une variable dans une méthode
public void GetAddress(ref int number,ref string street) {number = this.number;street = this.street;
}
. . .int sNumber = 0; string streetName = null;zoo.GetAddress( ref sNumber, ref streetName );// sNumber et streetName ont de nouvellesvaleurs
Comment la mémoire est organisée
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 70/195
Comment la mémoire est organisée
La mémoire est divisée en deux parties: stack et heap. Les value types sont créés dans la stack.
Les reference types (objects) sont créés dans le heap.
La classe System Object
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 71/195
La classe System.Object
Toutes les classes héritent de la classe System.Object .
Il est possible d’utiliser System.Object pour créer unevariable qui fait référence à n’importe quel referencetype .
Utiliser object plutôt que System.Object .
Boxing
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 72/195
Boxing
Une variable de type object peut également faire
référence à un value type .
Modifier la variable i ne modifie pas la variable o.
unboxing
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 73/195
unboxing
int i = 42;
object o = i;
i = (int)o;
Unboxing (suite)
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 74/195
Unboxing (suite)
Le type spécifié lors du unboxing cast doit exactement
correspondre au type actuellement du box.
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 75/195
Chapitre 9: Créer des
Value Types avec desEnumerations et des
Structs
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 76/195
Afficher des variables
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 77/195
Afficher des variables
Season colorful = Season.Fall;Console.WriteLine(colorful); // Affiche 'Fall'
string name = colorful.ToString();Console.WriteLine(name); // Affiche aussi 'Fall'
Season colorful = Season.Fall;Console.WriteLine((int) colorful); // Affiche 2
enum Season { Spring, Summer, Fall, Winter}
Utiliser les types énumérations
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 78/195
Utiliser les types énumérations
Affecter des valeurs aux éléments de l’Énumération
Affecter un type sous-jacent aux éléments del’Énumération
enum Season { Spring = 1, Summer, Fall, Winter }
enum Season { Spring, Summer, Fall, Autumn = Fall, Winter }
enum Season : short { Spring, Summer, Fall, Winter }
Le type Structure
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 79/195
Le type Structure
Une structure peut avoir des propres champs,
méthodes, et constructeurs comme une a classe, maiselle un value type et non un reference type
Une structure est stockée dans le stack
Les types int, long, et float, sont des alias pour les
structures System.Int32, System.Int64, et System.Single
Il n’est pas possible de déclarer un constructeur par défaut car le compilateur le génère automatiquement siun autre constructeur n’a pas été défini.
Le constructeur par défaut initialisera les champs de lastructure à 0, false, ou null
Structure ou classe
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 80/195
Structure ou classe
StructureSystem.UInt16Ushort
StructureSystem.UInt64Ulong
StructureSystem.UInt32Uint
ClassSystem.StringString
StructureSystem.Int16Short
StructureSystem.SByteSbyte
ClassSystem.ObjectObject
StructureSystem.Int64Long
StructureSystem.Int32Int
StructureSystem.SingleFloat
StructureSystem.DoubleDouble
StructureSystem.Decimaldecimal
StructureSystem.Bytebyte
StructureSystem.Booleanbool
Class or structureType equivalentKeyword
StructureSystem.UInt16Ushort
StructureSystem.UInt64Ulong
StructureSystem.UInt32Uint
ClassSystem.StringString
StructureSystem.Int16Short
StructureSystem.SByteSbyte
ClassSystem.ObjectObject
StructureSystem.Int64Long
StructureSystem.Int32Int
StructureSystem.SingleFloat
StructureSystem.DoubleDouble
StructureSystem.Decimaldecimal
StructureSystem.Bytebyte
StructureSystem.Booleanbool
Class or structureType equivalentKeyword
Définir un type Structure
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 81/195
yp S
struct Time {public Time(int hh, int mm, int ss) {
hours = hh % 24;minutes = mm % 60;
seconds = ss % 60;}public int Hours() {
return hours;}...private int hours, minutes, seconds;
}
La différence entre structure et classe
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 82/195
struct Time {public Time() {
...} // erreur de compilation...
}
struct Time {public Time(int hh, int mm){hours = hh;minutes = mm;
} // erreur de compilation : seconds pas initialisée...private int hours, minutes, seconds;}
struct Time {...private int hours = 0; // erreur de compilationprivate int minutes;private int seconds;
}
Déclarer une variable Structure
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 83/195
struct Time {int hours, minutes, seconds;}
class Example {public void Method(Time parameter) {
Time localVariable;
...}private Time currentTime;
}
L’initialisation d’une structure
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 84/195
struct Time {public Time(int hh, int mm){
hours = hh;minutes = mm;seconds = 0;
}...private int hours, minutes, seconds;}
Copier une variable structure
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 85/195
p
Time now;Time copy = now; // compile time error: now unassigned
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 86/195
Chapitre 10:
Utiliser Array etCollection
Qu’est ce qu’un Array?
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 87/195
q y
Une structure de données qui contient un nombre devariables appelées array elements.
Tous les array elements doivent être de même type
Un Array est zero indexed
Un Array est un objet, c’est donc un reference type Un Array peut être :
Single-dimensional
Multidimensional
Jagged, un array dont les éléments sont des array
Déclarer et instantier un Array
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 88/195
y
Déclarer un array en ajoutant deux crochets après le
type de ses éléments
Instantier un array int[ ] numbers = new int[5];
Créer un array de type Object
object [ ] animals = new object [100];
Créer un array bi-dimensionnel
int[,] table = new int[4,6];
int[] MyIntegerArray;
Déclarer et instantier un Array (suite)
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 89/195
y ( )
Initialiser et Accéder aux Array Members
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 90/195
Initialiser un array
Accéder aux array members
int[] numbers = new int[10] {10, 9, 8, 7, 6,5, 4, 3, 2, 1, 0};
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2,1, 0};
string[] animal = {"Mouse", "Cat", "Lion"};animal[1]= "Elephant";
string someAnimal = animal[2];
Parcourir les éléments d’un Array en utilisant foreach
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 91/195
Utiliser foreach permet de répéter les instructions pour
chaque élément du array
ou
int[] numbers = {4, 5, 6, 1, 2, 3, -2, -1, 0};
foreach (int i in numbers) {
Console.WriteLine(i);
}
int[] numbers = {4, 5, 6, 1, 2, 3, -2, -1, 0};
for (int ndex = 0; index != numbers; index++) {
int i = numbers[index];
Console.WriteLine(i);
}
Quand ne pas utiliser foreach
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 92/195
foreach parcourt tous les éléments du array, pour parcourir une partie seulement utiliser l’instruction for.
foreach parcourt le array de l’index 0 vers l’indexLength – 1. Pour le parcours inverse utiliser l’instruction for.
Si le corps de la boucle a besoin de connaître l’indexd’un élément plutôt que sa valeur, utiliser l’instructionfor.
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 93/195
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 94/195
La classe ArrayList
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 95/195
ArrayList n’a pas la taille fixe; elle peut grandir aubesoin
Utiliser Add pour ajouter un object à la fin de laArrayList
Utiliser insert pour ajouter un object à une positiondans la ArrayList
Utiliser remove pour supprimer un object de laArrayList
Utiliser[] pour accéder aux éléments de la ArrayList
Utiliser Clear pour supprimer tous les éléments
Exemple
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 96/195
ArrayList numbers = new ArrayList();
foreach (int number in new int[12]{10,9,8,7,7,6,5,10,4,3,2,1}) {
numbers.Add(number);
}
// Supprimer le 1er élément dont la valeur est 7
numbers.Remove(7);
// Supprimer le 7ème élément (10) numbers.RemoveAt(6);
// Afficher les 10 éléments restants avec for
for (int i = 0; i != numbers.Count; i++) {
int number = (int)numbers[i]; //besoin d’un cast
Console.WriteLine(number);
}
// Afficher les 10 éléments restants avec foreach
foreach (int number in numbers){
Console.WriteLine(number); //pas besoin d’un cast
}
Les classes Queue et Stack
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 97/195
Queues: first-in, first-out Enqueue place les objets dans la queue
Dequeue supprime les objets de la queue
Stacks: last-in, first-out Push place les objets dans la stack
Pop supprime les objets de la stack
Exemple de la classe Queue
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 98/195
Queue numbers = new Queue();
// Remplir la queueforeach (int nbr in new int[4]{9, 3, 7, 2}) {
numbers.Enqueue(nbr);
Console.WriteLine(nbr + " a rejoint la queue " );
}
// Afficher les éléments de la queue
foreach (int number in numbers) {
Console.WriteLine(number);
}
// Vider la queue
while (numbers.Count != 0) {
int number = (int)numbers.Dequeue();
Console.WriteLine(number + " a quitté la queue");
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 99/195
La classe HashTable
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 100/195
Une hashtable est une structure de données qui associe une
clé avec un object, pour une recherche rapide Une SortedList est une hashtable dont les clés sont triées
Book techBook = new Book("Inside C#", 0735612889);// ...public Hashtable bookList;//
bookList.Add(0735612889, techBook);// Book b = (Book) bookList[0735612889];// le titre de b est "Inside C#"
ObjectKey
Exemple de la classe Hashtable
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 101/195
Hashtable ages = new Hashtable();// Remplir la Hashtable
ages["John"] = 41;
ages["Diana"] = 42;
ages["James"] = 13;
ages["Francesca"] = 11;// Parcourir la Hashtable
foreach (DictionaryEntry element in ages) {
string name = (string)element.Key;
int age = (int)element.Value;
Console.WriteLine("Name: {0}, Age: {1}", name, age);}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 102/195
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 103/195
Chapitre 11 :Parameter Arrays
Utiliser un Array comme paramètres d’une Méthode
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 104/195
class Util{
public static int Min(int[] paramList){
if (paramList == null || paramList.Length == 0){
throw new ArgumentException("Util.Min");}int currentMin = paramList [0];foreach (int i in paramList)
{ if (i < currentMin){
currentMin = i;}
}return currentMin;
}
}
...int[] array = new int[3];array[0] = first;array[1] = second;array[2] = third;...
int min = Util.Min(array);
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 105/195
A ne pas faire
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 106/195
params ne peut être utilisée que pour des arrays d’une dimension.
Une méthode ne peut être surchargée sur la base de params seulement.
Il est interdit d’utiliser ref ou out pour des params arrays.
Un params array doit être le dernier paramètre.
Le compilateur détecte et rejette les surcharges potentiellementambiguës.
Une méthode non-params est toujours plus prioritaire sur une méthodeparams : Lorsque Min est appelée avec 2 paramètres, c’est la 1ère qui estexécutée
public static int Min(params int[,] table)
public static int Min(int[] paramList)public static int Min(params int[] paramList)
public static int Min(ref params int[] paramList)
public static int Min(out params int[] paramList)
public static int Min(params int[] paramList, int i)
public static int Min(params int[] paramList)
public static int Min(int, params int[] paramList)
public static int Min(int leftHandSide, int rightHandSide)public static int Min(params int[] paramList)
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 107/195
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 108/195
Chapitre 12 : L’héritage
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 109/195
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 110/195
L’héritage
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 111/195
L’héritage spécifie unerelation « est une sorte de/ is a kind of »
Les classes dérivées
héritent les propriétés etles méthode de la classede base, permettant ainsila réutilisation du code
Les classes dérivéesdeviennent plusspécialisées
Classe de base
Classes dérivées
Animal
Elephant Cat
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 112/195
Appeler le constructeur de base à partir de la classedérivée
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 113/195
Le mot clé base est utilisé par classe dérivée pour appeler le non-default constructor de la classe de base
public class Animal {public Animal(GenderType gender) {
// . . .
Console.WriteLine("Constructing Animal");}
}
public class Elephant : Animal {public Elephant(GenderType gender): base(gender) {
//Elephant codeConsole.WriteLine("Constructing Elephant");
}}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 114/195
Les méthodes new
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 115/195
Le mot clé new permet de supprimer le warning seulement
class Token{
...
public string Name() { ... }}
class IdentifierToken : Token{
...
new public string Name() { ... }}
Polymorphisme
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 116/195
ObjetsAnimal
Elephant
Cat
Mouse
Comportement
Mange l’herbe
Mange la souris
Mange le fromage
MéthodeAppelée
Eat ()
Eat ()
Eat ()
Les méthodes Virtual
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 117/195
public class Animal {public virtual void Eat() {
Console.WriteLine("Eat something");
}
}
public class Cat : Animal {
public override void Eat() {
Console.WriteLine("Eat small animals");
}
}
Les méthodes Virtual (suite)
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 118/195
Les méthodes Virtual sont utilisées pour définir lesméthodes des classes de bases qui peuvent êtreredéfinies dans les classes dérivées
Classe de Base
Animal
Méthode Virtual
Eat ()
Classe dérivée
Cat
Méthode Override
Eat ()
Eat MouseEat Something
RésultatRésultat
Exemple
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 119/195
class Mammal{
public virtual string GetTypeName(){return "This is a mammal";
}}
class Horse : Mammal{
public override string GetTypeName(){
return "This is a horse";}
}
class Whale : Mammal{
public override string GetTypeName ()
{return "This is a whale";
}}
class Kangaroo : Mammal{
...
}
Mammal m;Horse h = new Horse();Whale w = new Whale();Kangaroo k = new Kangaroo();
m = h;Console.WriteLine(m.GetTypeName());m = w;Console.WriteLine(m.GetTypeName());m = k;Console.WriteLine(m.GetTypeName());
Comment utiliser les membres de la classe de basepar la classe dérivée
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 120/195
Le mot clé base est utilisé pour appeler une méthodedans la classe de base à partir de la classe dérivée
public class Cat : Animal {
public override void Eat() {
base.Eat();
Console.WriteLine("Eat small animals");
}
}
Quelques règles pour les méthodes virtual
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 121/195
Il est pas possible de déclarer virtual ou override une
méthode private. Les deux méthodes doivent être identiques (même
signature).
Les deux méthodes doivent avoir le même accès
(public, public par exemple). On ne peut override qu’une méthode virtual.
Si la classe dérivée n’est pas override, elle ne redéfiniepas la méthode de la classe de base.
Une méthode override est implicitement virtual et doncpeut être overridden. Il n’est pas permis de déclarer virtual une méthode override.
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 122/195
Qu’est ce qu’une Interface?
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 123/195
Une interface:
Un reference type qui défini un contrat
Spécifie les membres qui doivent être fournis par lesclasses ou interfaces qui implémentent l’interface
Peut contenir des méthodes, des propriétés, desindexers et des évènements
Ses membres ne sont pas implémentés
Peut hériter de zéro ou plusieurs interfaces
Les restrictions sur les interfaces
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 124/195
Une interface:
Ne contient pas de champs, même static.
Ne contient pas de constructeurs.
Ne contient pas de destructeurs.
Ne contient pas des access modifiers. Toutes lesméthodes sont implicitement public.
Ne contient pas les enums, structs, classes, interfaces,or delegates.
Ne peut être héritée à partir d’une classe ou d’unestructure.
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 125/195
Travailler avec des objets qui implémentent desinterfaces
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 126/195
is
as
if ( anAnimal is ICarnivore ) {ICarnivore meatEater = (ICarnivore) anAnimal;Animal prey = meatEater.Hunt();meatEater.Eat( prey );
}
ICarnivore meatEater = anAnimal as ICarnivore;if ( meatEater != null ) {
Animal prey = meatEater.Hunt();meatEater.Eat( prey );
}
// is et as avec un objetif ( prey is Antelope ) { ... }
Référencer une classe à travers son interface
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 127/195
IdentifierToken it = new IdentifierToken();IToken iTok = it; // légal
void Process(Itoken iTok)
{...
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 128/195
Les Interfaces et le .NET Framework
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 129/195
Permettent à vos objets de se comporter comme les objets
du .NET Framework Exemple: Interfaces utilisées par les classes Collection
ICollection, IComparer, IDictionary, IDictionary Enumerator,IEnumerable, IEnumerator, IHashCodeProvider, IList
public class Zoo : IEnumerable {. . .public IEnumerator GetEnumerator() {
return (IEnumerator)new ZooEnumerator(this );}
Les classes et les méthodes abstract
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 130/195
Une classe abstract class est une classe de base générique
Contient une méthode abstract qui doit être implémentée par uneclasse dérivée
Une méthode abstract n’est pas imlémentée dans la classe de base
Elle peut contenir des membres non-abstract
Elle ne peut être instanciée
public abstract class Animal {public abstract void Eat();
public abstract Group PhylogenicGroup { get; }
}
Les classes et les méthodes Sealed
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 131/195
Les classes abstract
Il est impossible de créer une classe dérivée à partir d’une classe sealed
Une classe sealed ne contient pas de méthodes virtual
Les méthodes sealed
Une méthode sealed ne peut être overidden dans la
classe dérivée. Une méthode doit être override pour lui attribuer le
qualificatif sealed : la méthode sera déclarée sealedoverride.
public sealed class MyClass {
// class members}
interface, virtual, override, et sealed
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 132/195
Une interface introduit le nom d’une méthode.
Une méthode virtual est la première implémentationd’une méthode.
Une méthode override est une autre implémentationd’une méthode.
Une méthode sealed est la dernière implémentationd’une méthode.
Résumé
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 133/195
Mot clé Interface Classe Abstract Classe Classe sealed struct Abstract
no
yes
no
no
no
New yes* yes yes yes no† override no yes yes yes no‡ private no yes yes yes yes protected no yes yes yes no** public no yes yes yes yes sealed no yes yes yes no virtual no yes yes no no *Une interface peut étendre une autre interface et introduire une nouvelle
méthode avec la même signature.
†Une struct derive implicitement de System.Object, qui contient desméthodes que la struct peut cacher.
‡ Une struct dérive implicitement de System.Object, qui ne contient pasde méthodes virtual.
**Une struct est implicitement sealed.
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 134/195
Chapitre 13:
Garbage Collection etResource Management
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 135/195
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 136/195
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 137/195
Resource Management
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 138/195
Certaines ressources sont si précieuse qu’il est
nécessaire de les libérer le plutôt possible. Ces classes possèdent des méthodes disposal pour
les libérer.
TextReader reader = new StreamReader(filename);
string line;while ((line = reader.ReadLine()) != null){
Console.WriteLine(line);}reader.Close();
Resource Management (suite)
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 139/195
Pour être sûr qu’une ressource est libérés
TextReader reader = new StreamReader(filename);try{
string line;while ((line = reader.ReadLine()) != null){
Console.WriteLine(line);}
}finally{
reader.Close();}
Encore mieux
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 140/195
using fournit un mécanisme propre pour contrôler le
temps de vie d’un objet. L’objet créé sera détruit à lafin du bloc d’instruction using.
L’objet doit implémenter l’interface IDisposable
using (TextReader reader = new
StreamReader(filename)){string line;while ((line = reader.ReadLine()) != null){
Console.WriteLine(line);}
}
Appeler la méthode Dispose à partir d’un destructeur
l E l IDi bl
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 141/195
class Example : IDisposable{
...~Example()
{ Dispose();}
public virtual void Dispose(){
if (!this.disposed){
try {// libérer les ressources précieuses
}finally {
this.disposed = true;GC.SuppressFinalize(this);}
}}
public void SomeBehavior() // méthode exemple{
checkIfDisposed();...
}...private void checkIfDisposed(){
if (this.disposed){
throw new ObjectDisposedException("Example");}
}
private Resource scarce;private bool disposed = false;
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 142/195
Part III :Créer des composants
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 143/195
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 144/195
Déclarer des propriétés
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 145/195
struct ScreenPosition{
public ScreenPosition(int X, int Y){this.x = rangeCheckedX(X);this.y = rangeCheckedY(Y);
}
public int X{
get { return this.x; }set { this.x = rangeCheckedX(value); }
}
public int Y{
get { return this.y; }
set { this.y = rangeCheckedY(value); }}
private static int rangeCheckedX(int x) { ... }private static int rangeCheckedY(int y) { ... }private int x, y;
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 146/195
Les propriétés Read-Only
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 147/195
struct ScreenPosition{...public int X{
get { return this.x; }}
}
origin.X = 140; // compile-time error
Les propriétés Write-Only
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 148/195
struct ScreenPosition{...public int X{
set { this.x = rangeCheckedX(value); }}
}Console.WriteLine(origin.X); // compile-time errororigin.X = 200; // okorigin.X += 10; // compile-time error
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 149/195
Les restrictions sur les propriétés
Il est interdit d’initialiser une propriété dans une struct
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 150/195
Il est interdit d initialiser une propriété dans une structou une classe en utilisant set (sans new)
Il est interdit d’utiliser une propriété comme unargument ref ou out argument.
Une propriété ne peut contenir qu’un set au plus et unget au plus.
get et set ne prennent pas d’arguments.
Il est interdit de déclarer une propriété const oureadonly.
ScreenPosition location;location.X = 40; //erreur
MyMethod(ref location.X); // erreur
const int X { get { ... } set { ... } } // erreur
Déclarer des propriétés dans des interfaces
interface IScreenPosition
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 151/195
{int X { get; set; }int Y { get; set; }
}
struct ScreenPosition : IScreenPosition{...public int X{
get { ... }
set { ... }}
public int Y{
get { ... }set { ... }
}
...}
class ScreenPosition:IScreenPosition{...public virtual int X
{ get { ... }set { ... }
}
public virtual int Y{
get { ... }set { ... }
}...
}
struct ScreenPosition: IScreenPosition
{ ...int IScreenPosition.X{
get { ... }set { ... }
}
int IScreenPosition.Y{get { ... }set { ... }
}...private int x, y;
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 152/195
Chapitre 15 :
Utiliser les Indexers
Que sont les indexers ?
Un indexer permet de voir un int comme un tableau de
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 153/195
Un indexer permet de voir un int comme un tableau debits et d’accéder aux bits de l’int
struct IntBits{
public IntBits(int initialBitValue){
bits = initialBitValue;}public bool this [ int index ]
{ get{
return (bits & (1 << index)) != 0;}
set
{ if (value) bits |= (1 << index);else
bits &= ~(1 << index);}
}private int bits;
}
Utiliser les indexers
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 154/195
Un indexer n’est pas une méthode.
Un indexer prend toujours un seul argument quispécifie quel élément est accédé.
Tous les indexers utilisent le mot clé this à la place du
nom de la méthode. Une classe ou une struct ne peutdéfinir qu’un seul indexer, il est toujours appelé this.
int adapted = 63;IntBits bits = new IntBits(adapted);
bool peek = bits[6];bits[0] = true; bits[31] = false;
Comparer les array et les indexers
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 155/195
Les indexers peuvcent utiliser des subscripts non-
numeric, alors que les arrays utilisent seulement dessubscripts entiers.
Les indexers peuvent être overloaded, alors que lesarrays ne le peuvent pas.
Les indexers ne peuvent être utilisés comme des
paramètres ref ou out, alors que les arrays le peuvent .
public int this [ string name ] { ... } // ok
public Name this [ PhoneNumber number ] { ... }public PhoneNumber this [ Name name ] { ... }
IntBits bits; // bits contient un indexerMethod(ref bits[1]);
Propriétés, Arrays, et Indexers
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 156/195
struct Wrapper
{ int[] data;...public int this [int i]{
get { return this.data[i]; }set { this.data[i] = value; }
}}
Wrapper wrap = new Wrapper();...int[] myData = new int[2];myData[0] = wrap[0];
myData[1] = wrap[1];myData[0]++;myData[1]++;
Déclarer des indexers dans des interfaces
interface IRawInt{
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 157/195
{bool this [ int index ] { get; set; }
}
struct RawInt : IRawInt{...public bool this [ int index ]{get { ... }
set { ... }}...
}
class RawInt : IRawInt{...public virtual bool this [ int index ]{get { ... }set { ... }
}
...}
struct RawInt : IRawInt{...
bool IRawInt.this [int index]{get { ... }set { ... }
}...
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 158/195
Chapitre 16 :
les Delegates et lesEvents
Créer un Delegate
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 159/195
Centre MédicalGérer les rendez-vous
AppelerProcessNextPatient
DelegateTypeRendez-vous
Gardien de Zoo 2
Soigne un antilopeCheckSabots
Gardien de Zoo 1
Soigne un lionCheckGriffes
AntilopeCheckSabots
LionCheckGriffes
Utiliser les delegateclass Controller{
d l t id t M hi D l t ()
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 160/195
delegate void stopMachineryDelegate();public stopMachineryDelegate StopMachinery{
get{return this.stopMachinery;
}
set{
this.stopMachinery = value;}
public void Add(stopMachineryDelegate stopMethod){
this.stopMachinery += stopMethod;}
public void Remove(stopMachineryDelegate stopMethod){
this.stopMachinery -= stopMethod;}
public void ShutDown(){
this.stopMachinery();}private stopMachineryDelegate stopMachinery;
}
Utiliser les delegates (suite)
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 161/195
Controller control = new Controller();FoldingMachine folder = new FoldingMachine();WeldingMachine welder = new WeldingMachine();PaintingMachine painter = new PaintingMachine();...control.Add(folder.StopFolding);
control.Add(welder.FinishWelding);control.Add(painter.PaintOff);...control.ShutDown();
Créer un adaptateur de méthodes (Method Adapter)
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 162/195
void StopFolding(int shutDownTime);
...void FinishFolding(){
folder.StopFolding(0);}...this.stopMachinery += FinishFolding;
delegate void stopMachineryDelegate();
...this.stopMachinery += folder.StopFolding;
Utiliser les méthodes anonymes comme adaptateurs
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 163/195
Une méthode anonyme est une méthode qui n’a pas de
nom
et
this.stopMachinery += delegate { folder.StopFolding(0); };
control.Add(delegate { folder.StopFolding(0); } );
Caractéristiques des méthodes anonymes
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 164/195
Les paramètres sont spécifiés entre parenthèses juste
après le mot clé delegate.
Une méthode Anonymous peut retourner des valeurs,mais le type de retour doit correspondre à celui dudelegate auquel elle est ajoutée.
Le code d’une méthode anonymous est du code C#
ordinaire. Il peut contenir des instructions, des appelsà des méthodes, des définitions de variables, …etc.
control.Add(delegate(int param1, string param2){ /* le code qui utilise param1 et param2 */ });
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 165/195
Déclarer un Event
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 166/195
class TemperatureMonitor
{
public delegate void StopMachineryDelegate();
public event StopMachineryDelegate MachineOverheating;
...
}
Souscrire à un Event
T t M it t M it T t M it ()
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 167/195
TemperatureMonitor tempMonitor = new TemperatureMonitor();
...tempMonitor.MachineOverheating += delegate {folder.StopFolding(0) };
tempMonitor.MachineOverheating += welder.FinishWelding;
tempMonitor.MachineOverheating += painter.PaintOff;
De même, pour supprimer une méthode d’unévénement, utiliser l’opérateur -=
Déclencher un Event
class TemperatureMonitor
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 168/195
class TemperatureMonitor
{
public delegate void StopMachinerDelegate;
public event StopMachineryDelegate MachineOverheating;
...
private void Notify()
{
if (this.MachineOverheating != null)
{
this.MachineOverheating();
}
}...
}
Ecrire un Event Handler
namespace System
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 169/195
p y{public delegate void EventHandler(object sender, EventArgs args) ;
public class EventArgs{
...}
}
namespace System.Windows.Forms{public class Control :{public event EventHandler Click;...}
public class Button : Control{
...}}
class Example : System.Windows.Forms.Form{private System.Windows.Forms.Buttonokay;
...
public Example()
{this.okay = new
System.Windows.Forms.Button();
this.okay.Click += newSystem.EventHandler(this.okay_Click);
...}
private void okay_Click(object sender,System.EventsArgs args){...
}}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 170/195
Chapitre 17 :introduire les Generics
Le problème avec les objets
public void Enqueue( object item );
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 171/195
using System.Collections;...Queue myQueue = new Queue();Circle myCircle = new Circle();myQueue.Enqueue(myCircle);...
myCircle = (Circle)myQueue.Dequeue();
Queue myQueue = new Queue();Circle myCircle = new Circle();myQueue.Enqueue(myCircle);...Clock myClock = (Clock)myQueue.Dequeue();//erreur à l’exécution
Queue myQueue = new Queue();int myInt = 99;myQueue.Enqueue(myInt); // box de int à un object(+ d’espace mem) ...myInt = (int)myQueue.Dequeue(); // unbox de l’object à un int
public void Enqueue( object item );public object Dequeue();
Les generics : la solution
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 172/195
using System.Collections.Generic;...Queue<Circle> myQueue = new Queue<Circle>();Circle myCircle = new Circle();
myQueue.Enqueue(myCircle);...myCircle = myQueue.Dequeue();
public class Queue<T> : ...
... public void Enqueue( T item );public T Dequeue();
Donc
Utiliser les generics
struct Person
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 173/195
struct Person{
...}
...Dictionary<string, Person> directory =new Dictionary<string, Person>();
Person john = new Person();directory["John"] = john;...john = directory["John"];
{
...}...Queue<int> intQueue = new Queue<int>();Queue<Person> personQueue = new Queue<Person>();Queue<Queue<int>> queueQueue = new Queue<Queue<int>>();
Il est possible pour une classe generic d’avoir multiple types deparamètres
Les generics et les contraintes
Il est possible d’ajouter des contraintes sur les éléments pour une
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 174/195
public class PrintableCollection<T> where T : IPrintable
Il est possible d ajouter des contraintes sur les éléments pour uneclasse generic
Les contraintes
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 175/195
Contrainte Description where T: struct Le type argument doit être une value type.
where T : class Le type argument doit être un reference type : class,interface, delegate, ou array type.
where T : new() Le type argument doit avoir un constructeur public sansparamètres. Lorsque elle est utilisée en conjonction avec
d’autres contraintes, la contrainte new() doit êtrespécifiée en dernier. where T : <base class name> Le type argument doit être ou dériver de la classe de base
spécifiée. where T : <interface name> Le type argument doit être ou implémenter l’ interface
spécifiée.
Les interfaces System.IComparable etSystem.IComparable<T>class Circle : System.IComparable{
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 176/195
...public int CompareTo(object obj)
{ Circle circObj = (Circle)obj;if (this.Area() == circObj.Area())
return 0;
if (this.Area() > circObj.Area())return 1;
return -1;}}
class Circle : System.IComparable<Circle>{
...public int CompareTo(Circle other){
if (this.Area() == other.Area())return 0;
if (this.Area() > other.Area())return 1;
return -1;}
public bool Equals(Circle other){
return (this.CompareTo(other) == 0);}
}
Créer une classe generic
Algorithme de construction de l’arbre binaire
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 177/195
If the tree, T, is empty
ThenConstruct a new tree T with the new item I as the node, and emptyleft and right sub-trees
ElseExamine the value of the node, N, of the tree, TIf the value of N is greater than that of the new item, IThenIf the left sub-tree of T is emptyThenConstruct a new left sub-tree of T with the item I as the node,and empty left and right sub-trees
ElseInsert I into the left sub-tree of T
End IfElseIf the right sub-tree of T is emptyThen
Construct a new right sub-tree of T with the item I as the node,and empty left and right sub-trees
ElseInsert I into the right sub-tree of T
End IfEnd If
End If
Schéma de l’arbre binaire
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 178/195
Insérer des éléments dans l’arbre
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 179/195
Créer une classe generic
Algorithme d’impression du contenu de l’arbre binaire
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 180/195
If the left sub-tree is not emptyThenDisplay the contents of the left sub-tree
End IfDisplay the value of the nodeIf the right sub-tree is not empty
ThenDisplay the contents of the right sub-treeEnd If
g p
Imprimer les éléments de l’arbre
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 181/195
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 182/195
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 183/195
Chapitre 18 :
Enumérer lesCollections
Utiliser foreach pour les collections énumérables.
Enumérer des éléments dans une collection
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 184/195
Une collection enumerable est une collection quiimplémente l’interfaceSystem.Collections.IEnumerable.
La classe System.Array est une collection quiimplémente l’interface IEnumerable.
L’interface IEnumerable contient une seule méthode :
Un objet enumerator implémente l’interfaceSystem.Collections.IEnumerator.
IEnumerator<T> et IEnumerable<T>.
IEnumerator GetEnumerator();
object Current {get;}bool MoveNext();void Reset();
Implémenter un Enumerator en utilisant un Iterator
class BasicCollection<T> : IEnumerable<T>{
private List<T> data = new List<T>();
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 185/195
private List<T> data = new List<T>();
public void FillList(params T [] items){for (int i = 0; i < items.Length; i++)
data.Add(items[i]);}
IEnumerator<T> IEnumerable<T>.GetEnumerator(){
for (int i = 0; i < data.Count; i++)yield return data[i];}
IEnumerator IEnumerable.GetEnumerator(){
// ...}
}
BasicCollection<string> bc = new BasicCollection<string>();bc.FillList("Twas", "brillig", "and", "the", slithy", "toves");foreach (string word in bc)
Console.WriteLine(word);
Implémenter une interface en utilisant un Iterator
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 186/195
public IEnumerable<T> Reverse
{get{
for (int i = data.Count - 1; i >= 0; i--)yield return data[i];
}}
BasicCollection<string> bc = new BasicCollection<string>();bc.FillList("Twas", "brillig", "and", "the", slithy", "toves");...foreach (string word in bc.Reverse)
Console.WriteLine(word);
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 187/195
Chapitre 19 :
Surcharger desopérateurs
Les contraintes sur les opérateurs
Il n’est pas possible de changer la précédence ou
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 188/195
Il n’est pas possible de changer la précédence ou
l’associativité d’un opérateur. Il n’est pas possible de changer la multiplicité d’un
operateur (le nombre d’opérandes).
Il n’est pas possible d’inventer de nouveaux symbolesd’opérateurs.
Il n’est pas permis de changer la signification d’unopérateur.
Certains opérateurs ne peuvent être surchargés. Exemple: l’opérateur point (member access).
Surcharger un opérateur
struct Hour{
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 189/195
{public Hour(int initialValue)
{ this.value = initialValue;}
public static Hour operator+ (Hour lhs, Hour rhs){
return new Hour(lhs.value + rhs.value);
}...private int value;
}
Un opérateur doit être public.
Un opérateur doit être static. Un opérateur n’est jamaispolymorphique (pas de virtual, abstract, override, ou sealed).
Un opérateur binaire a deux arguments explicites. Un opérateur unaire a un argument explicite
Créer des opérateurs symétriques
struct Hour{
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 190/195
public Hour(int initialValue)
{ this.value = initialValue;}...public static Hour operator+ (Hour lhs, Hour rhs){
return new Hour(lhs.value + rhs.value);
}public static Hour operator+ (Hour lhs, int rhs){
return lhs + new Hour(rhs);}...private int value;
}
Hour a = ...;
int b = ...;Hour sum = a + b;Hour som = b + a; // erreur
Définir des opérateurs d’incrémentation
t t H
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 191/195
struct Hour
{ ...public static Hour operator++ (Hour arg){
arg.value++;return arg;
}...private int value;
}
Hour now = new Hour(9);Hour postfix = now++;
Hour now = new Hour(9);Hour prefix = ++now;
Définir un opérateur d’incrémentation pour une classe
l H
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 192/195
class Hour
{ public Hour(int initialValue){
this.value = initialValue;}...public static Hour operator++(Hour arg){
return new Hour(arg.value + 1);}...private int value;
}
Définir les opérateurs en paires
Les opérateurs qui vont en paire doivent tous les deuxêtre définis Exemple: (== et !=) (< et >) (<= et >=) etc
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 193/195
être définis. Exemple: (== et !=), (< et >), (<= et >=),… etc.
Si les opérateurs == et != sont surchargés, il estrecommandé de surcharger Equals et GetHashCodestruct Hour{
public Hour(int initialValue){
this.value = initialValue;}...public static bool operator==(Hour lhs, Hour rhs){
return lhs.value == rhs.value;}
public static bool operator!=(Hour lhs, Hour rhs){
return lhs.value != rhs.value;}...private int value;
}
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 194/195
8/3/2019 Cours Visual C Sharp
http://slidepdf.com/reader/full/cours-visual-c-sharp 195/195