Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à...

57
Formation universitaire à Formation universitaire à .NET: .NET: Introduction à C# Introduction à C# © © Patrick SMACCHIA Patrick SMACCHIA http:// www.smacchia.com © Patrick Smacchia/Microsoft Research Cambridge 2004 Les supports (cours et lab) de cette formation peuvent être utilisés gratuitement dans le cadre de tout enseignement à but non lucratif. acter moi avant toute utilisation non personnelle de ces supports : patrick @ smacchia.co

Transcript of Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à...

Page 1: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Formation universitaire Formation universitaire

à .NET:à .NET: Introduction à C# Introduction à C#

© © Patrick SMACCHIAPatrick SMACCHIAhttp://www.smacchia.com

© Patrick Smacchia/Microsoft Research Cambridge 2004

Les supports (cours et lab) de cette formation peuvent être utilisés gratuitement

dans le cadre de tout enseignement à but non lucratif.

Contacter moi avant toute utilisation non personnelle de ces supports : [email protected]

Page 2: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

2

PlanPlan

Eléments de baseEléments de baseStructures de contrôleStructures de contrôleClasses & objetsClasses & objetsHéritage, polymorphisme & Héritage, polymorphisme &

interfacesinterfacesExceptionsExceptionsAutres éléments de C#Autres éléments de C#

Page 3: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

3

Les espaces de nomsLes espaces de noms Une ressource dans le code source a la possibilité Une ressource dans le code source a la possibilité

d’être déclarée et définie à l’intérieur d’un espace de d’être déclarée et définie à l’intérieur d’un espace de noms.noms.

Si une ressource n’est déclarée dans aucun espace de Si une ressource n’est déclarée dans aucun espace de noms elle fait partie d’un espace de noms global et noms elle fait partie d’un espace de noms global et anonyme.anonyme.

Eléments de base

using Foo1;

using Foo1.Foo2;

using System;

namespace Foo1

{

// ici les ressources de l'espace de noms Foo1

namespace Foo2

{

// ici les ressources de l'espace de noms Foo1.Foo2

}

// ici les ressources de l'espace de noms Foo1

}

Page 4: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

4

Organisation du code Organisation du code sourcesource

Eléments de base

Projet

… …

FichierN.cs

Fichier1.cs

Fichier2.cs

Namespace 1 Namespace 2

Ressource B

Namespace M

Ressource ARessource C

Ressource D

Page 5: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

5

La méthode Main() (1/2)La méthode Main() (1/2) Chaque assemblage exécutable a au moins une Chaque assemblage exécutable a au moins une

méthode statique méthode statique Main()Main() dans une de ses dans une de ses classes.classes.

Cette méthode représente le Cette méthode représente le point d’entrée du point d’entrée du programmeprogramme, c’est-à-dire que le thread principal , c’est-à-dire que le thread principal créé automatiquement lorsque le processus se créé automatiquement lorsque le processus se lance va commencer par exécuter le code de lance va commencer par exécuter le code de cette méthode.cette méthode.

Il peut y avoir éventuellement plusieurs Il peut y avoir éventuellement plusieurs méthodes méthodes Main()Main() (chacune dans une classe (chacune dans une classe différente) par programme. Le cas échéant, il différente) par programme. Le cas échéant, il faut préciser au compilateur quelle méthode faut préciser au compilateur quelle méthode Main()Main() constitue le point d’entrée du constitue le point d’entrée du programme.programme.

Eléments de base

Page 6: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

6

La méthode Main() (2/2)La méthode Main() (2/2) Le programme suivant ajoute les nombres passés en Le programme suivant ajoute les nombres passés en

arguments en ligne de commande, et affiche le résultat. arguments en ligne de commande, et affiche le résultat. S’il n’y a pas d’argument, le programme le signale : S’il n’y a pas d’argument, le programme le signale : 

Eléments de base

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 += System.Int64.Parse(s);

Console.WriteLine("Somme de ces nombres :{0}",result);

}

}

}

Page 7: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

7

Les commentairesLes commentaires

Il existe trois façons de commenter du texte Il existe trois façons de commenter du texte dans un fichier source C# :dans un fichier source C# : Le texte placé entre les balises Le texte placé entre les balises /*/* suivie de suivie de */*/ est est

commenté. Ces balises peuvent éventuellement commenté. Ces balises peuvent éventuellement se trouver sur deux lignes différentes.se trouver sur deux lignes différentes.

Si une ligne contient la balise Si une ligne contient la balise //// alors le texte de alors le texte de cette ligne qui suit cette balise est commenté.cette ligne qui suit cette balise est commenté.

Si une ligne contient la balise Si une ligne contient la balise ////// alors le texte de alors le texte de cette ligne qui suit cette balise est commenté. cette ligne qui suit cette balise est commenté. De plus ce texte fera partie de la documentation De plus ce texte fera partie de la documentation automatique.automatique.

Eléments de base

Page 8: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

8

PlanPlan

Eléments de baseEléments de baseStructures de contrôleStructures de contrôleClasses & objetsClasses & objetsHéritage, polymorphisme & Héritage, polymorphisme &

interfacesinterfacesExceptionsExceptionsAutres éléments de C#Autres éléments de C#

Page 9: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

9

DéfinitionDéfinition Une structure de contrôle est un élément du Une structure de contrôle est un élément du

programme qui change le comportement par programme qui change le comportement par défaut de l’unité d’exécution (du thread). défaut de l’unité d’exécution (du thread). Rappelons que ce comportement par défaut est Rappelons que ce comportement par défaut est d’exécuter les instructions les unes à la suite des d’exécuter les instructions les unes à la suite des autres.autres.

Trois familles de structures de contrôles:Trois familles de structures de contrôles: Les Les conditionsconditions, qui exécutent (ou pas) un bloc de code , qui exécutent (ou pas) un bloc de code

qu’à une certaine condition, portant généralement sur qu’à une certaine condition, portant généralement sur les états de variables et d’objets. les états de variables et d’objets.

Les Les bouclesboucles, qui exécutent en boucle un bloc , qui exécutent en boucle un bloc d’instructions. Le programmeur a le choix entre terminer d’instructions. Le programmeur a le choix entre terminer de boucler après un certain nombre d’itérations, ou de boucler après un certain nombre d’itérations, ou terminer de boucler à une certaine condition. terminer de boucler à une certaine condition.

Les Les branchementsbranchements ou  ou sautssauts, qui permettent de rediriger , qui permettent de rediriger directement vers une instruction particulière l’unité directement vers une instruction particulière l’unité d’exécution.d’exécution.

Structures de contrôle

Page 10: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

10

Les conditionsLes conditions Trois types de condition: Trois types de condition: if/else switch

L’opérateur ternaire L’opérateur ternaire ?:

Structures de contrôle

if( b == true ) // si b vaut true alors...

if( i >= 4 && i<= 6) // si i dans l'intervalle fermé [4,6] alors...

if( i < 4 || i > 6) // si i hors de l'intervalle fermé [4,6] alors...

...

// s="bonjour" si i strictement inférieur à j, sinon s="hello"

string s = i<j ? "bonjour" : "hello";

...

switch(i)

{

case 1: Console.WriteLine("i vaut 1");

break;

case 6: Console.WriteLine("i vaut 6");

break;

default:Console.WriteLine("i ne vaut ni 1 ni 6");

break;

}

Page 11: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

11

Les bouclesLes boucles Quatre types de boucle: Quatre types de boucle: while do/while for foreach

Structures de contrôle

int i=0;int j=8;

while( i < 6 && j > 9 )

{

i++;j--;

}

int i=0;int j=8;

do

{

i++;j--;

}

while( i < 6 && j > 9)

for(int i = 1; i<=6 ; i++) ...

int i = 3;int j=5;

for(; i<7&& j>1 ;i++ , j--)...

for( int i =6 ; i<9 ; ) { ... i++;}

int [] tab = {1,3,4,8,2};

// Calcul de la somme des éléments du tableau.

int Somme = 0;

foreach(int i in tab )

Somme += i;

// Somme vaut : 1+3+4+8+2 = 18

Page 12: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

12

PlanPlan

Eléments de baseEléments de baseStructures de contrôleStructures de contrôleClasses & objetsClasses & objetsHéritage, polymorphisme & Héritage, polymorphisme &

interfacesinterfacesExceptionsExceptionsAutres éléments de C#Autres éléments de C#

Page 13: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

13

La Programmation Orientée La Programmation Orientée Objet (POO ou OOP)Objet (POO ou OOP)

Le concept de la Le concept de la programmation fonctionnelleprogrammation fonctionnelle est est construit autour de la notion de fonction. Tout construit autour de la notion de fonction. Tout programme est un ensemble de fonctions s’appelant programme est un ensemble de fonctions s’appelant entre elles.entre elles.

Le concept de la Le concept de la programmation objetprogrammation objet est construit est construit autour des notions d’objet et de classe. autour des notions d’objet et de classe. Une classe est Une classe est l’implémentation d’un type de donnéesl’implémentation d’un type de données (au même titre (au même titre que int ou une structure). que int ou une structure). Un objet est une instance Un objet est une instance d’une classed’une classe..

L’avantage majeur de la POO sur la L’avantage majeur de la POO sur la Programmation fonctionnelle est de réunir les Programmation fonctionnelle est de réunir les données avec leurs traitements.données avec leurs traitements.

Classes & objets

Page 14: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

14

Classe et membreClasse et membre Exemple de déclaration.Exemple de déclaration.

Les membres d’une classe sont des Les membres d’une classe sont des entités déclarées dans la classe. entités déclarées dans la classe.

Classes & objets

class MaClasse

{

// Ici sont placés les membres de la classe MaClasse.

static void Main(string[] args)

{

// Ici sont placés les instructions de la méthode Main().

}

// Ici aussi, sont placés les membres de la classe MaClasse.

}

Page 15: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

15

Structures vs. ClassesStructures vs. Classes La déclaration d’une structure se fait avec La déclaration d’une structure se fait avec

le mot clé le mot clé struct à la place de à la place de class.. La principale différence est qu’une La principale différence est qu’une

structure définit un type valeur alors structure définit un type valeur alors qu’une classe définit un type référence.qu’une classe définit un type référence.

Une autre différence est que les structures Une autre différence est que les structures ne connaissent pas la notion d’héritage ne connaissent pas la notion d’héritage d’implémentation (voir plus loin).d’implémentation (voir plus loin).

Une référence vers une instance d’une Une référence vers une instance d’une structure peut être obtenue avec structure peut être obtenue avec l’opération de boxing.l’opération de boxing.

Classes & objets

Page 16: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

16

Les membres d’une Les membres d’une classeclasse

Six types de membres d’une classe:Six types de membres d’une classe: Les Les champschamps : un champs d’une classe définit une  : un champs d’une classe définit une

donnée (type valeur) ou une référence vers une donnée donnée (type valeur) ou une référence vers une donnée (type référence) qui existe pour toute instance de la (type référence) qui existe pour toute instance de la classe.classe.

Les Les méthodesméthodes : peut être vu comme un traitement sur  : peut être vu comme un traitement sur les données d’un objet.les données d’un objet.

Les Les propriétéspropriétés : peut être vu comme un couple de  : peut être vu comme un couple de méthode pour intercepter les accès (lecture/écriture) aux méthode pour intercepter les accès (lecture/écriture) aux données d’un objet avec la syntaxe d’accès aux champs.données d’un objet avec la syntaxe d’accès aux champs.

Les Les indexeursindexeurs : propriété spéciale utilisant la syntaxe  : propriété spéciale utilisant la syntaxe d’accès à un tableau []. d’accès à un tableau [].

Les Les événementsévénements : facilite l’implémentation de la notion  : facilite l’implémentation de la notion de programmation événementielle.de programmation événementielle.

Les Les types encapsuléstypes encapsulés dans la classe. dans la classe.

Classes & objets

Page 17: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

17

Encapsulation et niveau de Encapsulation et niveau de visibilitévisibilité

Classes & objets

Page 18: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

18

Exemple: Propriétés, Exemple: Propriétés, champs niveau de visibilitéchamps niveau de visibilité

Classes & objets

public class UneClasse

{

// Un champ privé de type int.

private int m_ChampPrivé = 10;

public int m_Prop // Une propriété publique de type int.

{

get{ return m_ChampPrivé;}

set{ m_ChampPrivé = value;}

}

static void Main()

{

UneClasse A = new UneClasse();

A.m_Prop = 56; // L'accesseur set est appelé.

int i = A.m_Prop;// L'accesseur get est appelé.

}

}

Page 19: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

19

Les constructeursLes constructeurs Une méthode est automatiquement appelée lorsque l’objet Une méthode est automatiquement appelée lorsque l’objet

est construit. On appelle ce type de méthode un est construit. On appelle ce type de méthode un constructeurconstructeur ( (ctorctor en abrégé). en abrégé).

En C#, syntaxiquement, une méthode constructeur porte le En C#, syntaxiquement, une méthode constructeur porte le nom de la classe, et ne retourne rien (même pas le type nom de la classe, et ne retourne rien (même pas le type void).void).

Pour chaque classe il peut y avoir :Pour chaque classe il peut y avoir : Aucun constructeur : dans ce cas le compilateur fournit Aucun constructeur : dans ce cas le compilateur fournit

automatiquement un automatiquement un constructeur par défautconstructeur par défaut, qui n’accepte , qui n’accepte aucun argument.aucun argument.

Un seul constructeur : dans ce cas, ce sera toujours lui qui sera Un seul constructeur : dans ce cas, ce sera toujours lui qui sera appelé. Le compilateur ne fournit pas de constructeur par appelé. Le compilateur ne fournit pas de constructeur par défaut. défaut.

Plusieurs constructeurs : dans ce cas ils diffèrent selon leurs Plusieurs constructeurs : dans ce cas ils diffèrent selon leurs signatures (i.e nombre et type des arguments). Le compilateur signatures (i.e nombre et type des arguments). Le compilateur ne fournit pas de constructeur par défaut.ne fournit pas de constructeur par défaut.

Lorsqu’une méthode constructeur retourne, il est impératif Lorsqu’une méthode constructeur retourne, il est impératif que tous les champs de type valeur de la classe aient été que tous les champs de type valeur de la classe aient été initialisés.initialisés.

Un constructeur admet un niveau de visibilité.Un constructeur admet un niveau de visibilité.

Classes & objets

Page 20: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

20

Le destructeurLe destructeur On nomme On nomme destructeurdestructeur la méthode de la classe qui est la méthode de la classe qui est

appelée par le appelée par le ramasse-miettesramasse-miettes juste avant qu’il désalloue juste avant qu’il désalloue la zone mémoire du tas occupée par l’objet. la zone mémoire du tas occupée par l’objet.

Il ne peut y avoir plus d’un destructeur dans une classe, et Il ne peut y avoir plus d’un destructeur dans une classe, et si le développeur n’en écrit pas, le compilateur crée un si le développeur n’en écrit pas, le compilateur crée un destructeur par défaut.destructeur par défaut.

Un destructeur est une méthode non statique avec le Un destructeur est une méthode non statique avec le même nom que sa classe, et commençant par le caractère même nom que sa classe, et commençant par le caractère tilde ‘~’.tilde ‘~’.

Syntaxiquement, un destructeur n’admet pas d’argument Syntaxiquement, un destructeur n’admet pas d’argument et ne retourne aucun type, même pas le type et ne retourne aucun type, même pas le type void..

En interne, le compilateur C# fait en sorte qu’un En interne, le compilateur C# fait en sorte qu’un destructeur est la réécriture de la méthode destructeur est la réécriture de la méthode Finalize() de de la classe la classe Object..

Un destructeur n’admet pas de niveau de visibilité.Un destructeur n’admet pas de niveau de visibilité.

Classes & objets

Page 21: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

21

Exemple: Construction et Exemple: Construction et destruction des objetsdestruction des objets

Classes & objets

public class Article

{

private int Prix;

public Article(int Prix) { this.Prix = Prix; } // ctor 1

public Article(double Prix) { this.Prix = (int) Prix; } // ctor 2

public Article() { Prix = 0; } // ctor 3

~Article() { /* rien à désallouer!*/ } // dtor

}

class Prog

{

static void Main(string[] args)

{

Article A = new Article(); // Appelle le ctor 3.

Article B = new Article(6); // Appelle le ctor 1.

Article C = new Article(6.3); // Appelle le ctor 2.

}

// le ramasse miettes appelle le destructeur sur les objets A B et C

// avant la terminaison du programme

}

Page 22: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

22

L’interface IDisposableL’interface IDisposable Technique pour pouvoir appeler automatiquement une certaine méthode

sur un objet, quand on décide que l’on n’aura plus besoin de ce dernier. Avantage par rapport au destructeur qui est appelé à un moment non

déterminé. L’utilisation de cette technique n’affecte en rien le ramasse-miettes.

Classes & objets

public class Article : IDisposable

{

// Déclaration des champs et méthodes...

public void Dispose() { /* désallouer ici ce qui doit l'être*/}

}

...

Article B = new Article();

using(B) // ATTENTION: rien à voir avec le using des espaces de noms

{

// Ici éventuellement utilisation de B.

// Cette zone est appelée zone de validité de B.

}// Cette accolade provoque l'appel automatique de B.Dispose().

// Fin de la zone de validité de B.

Page 23: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

23

Les membres statiquesLes membres statiques Les champs, les propriétés, les méthodes (y compris Les champs, les propriétés, les méthodes (y compris

les constructeurs mais pas le destructeur) et les les constructeurs mais pas le destructeur) et les événements d’une classe ont la possibilité d’être événements d’une classe ont la possibilité d’être déclaré avec le mot-clé déclaré avec le mot-clé static. .

Ce mot-clé signifie que le membre appartient à la Ce mot-clé signifie que le membre appartient à la classe, et non aux objets, comme c’est le cas des classe, et non aux objets, comme c’est le cas des membres non statiques.membres non statiques. Un membre statique a un niveau de visibilité.Un membre statique a un niveau de visibilité. Une méthode statique n’a pas accès aux méthodes, Une méthode statique n’a pas accès aux méthodes,

champs, propriétés et événements non statiques de la champs, propriétés et événements non statiques de la classe.classe.

Une méthode statique n’est pas accessible à partir d’une Une méthode statique n’est pas accessible à partir d’une référence vers une méthode de la classe.référence vers une méthode de la classe.

Une méthode statique est accessible dans toutes les Une méthode statique est accessible dans toutes les méthodes (statiques ou non) de la classe par son nom, et à méthodes (statiques ou non) de la classe par son nom, et à l’extérieur de la classe (si son niveau de visibilité le permet) l’extérieur de la classe (si son niveau de visibilité le permet) par la syntaxe : par la syntaxe : NomDeLaClasse.NomDeLaMéthodeStatique()

Classes & objets

Page 24: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

24

Exemple: Membres Exemple: Membres statiquesstatiques

Classes & objets

public class Article

{

static int NbArticles; // Un champ statique.

static Article() // Le constructeur statique.

{

NbArticles = 0;

}

int Prix = 0; // Un champ privé non statique.

public Article( int Prix )// ctor non statique

{

this.Prix = Prix;

NbArticles++;

}

~Article() // dtor

{

NbArticles--;

}

}

Page 25: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

25

Le mot clé thisLe mot clé this Dans toutes les méthodes Dans toutes les méthodes non statiquesnon statiques, ,

C# permet d’utiliser le mot-clé C# permet d’utiliser le mot-clé this. . Ce mot-clé est une référence vers l’objet Ce mot-clé est une référence vers l’objet

sur lequel opère la méthode courante.sur lequel opère la méthode courante. L’utilisation de ce mot clé témoigne en L’utilisation de ce mot clé témoigne en

général d’une architecture objet évoluée :général d’une architecture objet évoluée :

Classes & objets

class UneClasse

{

void fct() // méthode non statique

{

fct2(this);

}

static void fct2(UneClasse A )

{

// travaille avec l’objet référencé par A...

}

}

Page 26: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

26

PlanPlan

Eléments de baseEléments de baseStructures de contrôleStructures de contrôleClasses & objetsClasses & objetsHéritage, polymorphisme & Héritage, polymorphisme &

interfacesinterfacesExceptionsExceptionsAutres éléments de C#Autres éléments de C#

Page 27: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

27

La problèmatique (1/2)La problèmatique (1/2) La complexité d’un programme en fonction de sa taille, grandit La complexité d’un programme en fonction de sa taille, grandit

plus vite qu’une fonction linéaire de sa taille.plus vite qu’une fonction linéaire de sa taille.

Héritage, polymorphismes & interfaces

Le travail de l’architecte (le Le travail de l’architecte (le designerdesigner) d’un programme consiste à ce ) d’un programme consiste à ce que la complexité reste aussi proche que possible de la fonction que la complexité reste aussi proche que possible de la fonction linéaire.linéaire.

Le mécanisme de dérivation ou d’héritage, est un des points clés de la Le mécanisme de dérivation ou d’héritage, est un des points clés de la programmation objet.programmation objet.

Page 28: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

28

La problèmatique (2/2)La problèmatique (2/2) Souvent, dans une application, des classes ont des membres Souvent, dans une application, des classes ont des membres

similaires car elles sont sémantiquement proche: similaires car elles sont sémantiquement proche: Les classes Les classes Secrétaire, , Technicien et et Cadre peuvent avoir en peuvent avoir en

commun les champs commun les champs Nom, , Age, , Adresse et et Salaire et les et les méthodes méthodes Evalue() et et Augmente()..

Les classes Les classes Carré, , Triangle et et Cercle peuvent avoir en peuvent avoir en commun les champs commun les champs CouleurDuTrait et et TailleDuTrait et les et les méthodes méthodes Dessine(), , Translation() et et Rotation()..

Les classes Les classes Button, , ComboBox et et EditBox peuvent avoir en peuvent avoir en commun les champs commun les champs Position et et Enabled et les méthodes et les méthodes OnClick() et et OnMouseOver()..

On comprend bien que c’est parce que:On comprend bien que c’est parce que: Une secrétaire, un technicien ou un cadre est un Une secrétaire, un technicien ou un cadre est un employéemployé (i.e (i.e

une spécialisation du concept d’employé).une spécialisation du concept d’employé). Un carré, un triangle ou un cercle est une Un carré, un triangle ou un cercle est une formeforme géométriquegéométrique.. Un bouton, une combo-box ou une edit-box est un Un bouton, une combo-box ou une edit-box est un contrôle contrôle

graphiquegraphique..

Héritage, polymorphismes & interfaces

Page 29: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

29

La solution : L’héritageLa solution : L’héritage L’idée de la réutilisation est de cerner ces L’idée de la réutilisation est de cerner ces

similitudes, et de les encapsuler dans une classe similitudes, et de les encapsuler dans une classe appelée appelée classe de baseclasse de base (par exemple (par exemple Employé, , FigureGéométrique ou ou Control). ).

Les classes de base sont parfois appelées Les classes de base sont parfois appelées super super classesclasses..

Une Une classe dérivéeclasse dérivée est une classe qui est une classe qui héritehérite des des membres de la classe de base. Concrètement si membres de la classe de base. Concrètement si Technicien hérite de hérite de Employé, , Technicien hérite hérite des champs des champs Nom, , Age, Adresse etet Salaire et et des méthodes des méthodes Evalue() et et Augmente(). .

On dit aussi que la classe dérivée est une On dit aussi que la classe dérivée est une spécialisation de la clase de base.spécialisation de la clase de base.

Héritage, polymorphismes & interfaces

Page 30: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

30

Exemple : L’héritageExemple : L’héritageHéritage, polymorphismes & interfaces

using System;

class Employé

{

protected string Nom;

protected Employé(string Nom)

{this.Nom = Nom;}

}

class Technicien : Employé

{

private string Spécialité;

public Technicien(string Nom, string Spécialité): base(Nom)

{this.Spécialité = Spécialité;}

}

class Prog

{

public static void Main()

{

Employé E = new Technicien("Roger LaFleur","Electricien");

}

}

Page 31: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

31

Exemple : Schéma de Exemple : Schéma de dérivationdérivation

Héritage, polymorphismes & interfaces

CAnimal

CMammifère

CReptile

CHumain

CChien

CLézard

CBergerAllemand

CLabrador

CCaniche

Des normes telles que Des normes telles que UMLUML (Unified Modelling (Unified Modelling Language) permettent de faire des schéma pour Language) permettent de faire des schéma pour représenter les liens entre les classes:représenter les liens entre les classes:

Page 32: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

32

Méthodes virtuelles et polymorphisme Méthodes virtuelles et polymorphisme (1/3)(1/3)

En POO on est souvent confronté au problème suivant : En POO on est souvent confronté au problème suivant : On crée des objets, instances de plusieurs On crée des objets, instances de plusieurs

classes classes dérivées d’une classe de base, puis on dérivées d’une classe de base, puis on veut leur veut leur appliquer un traitement de base, c’est-à-appliquer un traitement de base, c’est-à-dire, un dire, un traitement défini dans la classe de base. traitement défini dans la classe de base.

Le problème est que ce traitement diffère selon la classe Le problème est que ce traitement diffère selon la classe dérivée.dérivée.

Par exemple on veut obtenir une description de tous les Par exemple on veut obtenir une description de tous les employés (traitement de base : obtenir une description employés (traitement de base : obtenir une description d’un employé, quelle que soit sa catégorie).d’un employé, quelle que soit sa catégorie).

Héritage, polymorphismes & interfaces

Page 33: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

33

Méthodes virtuelles et polymorphisme Méthodes virtuelles et polymorphisme (2/3)(2/3)

Héritage, polymorphismes & interfaces

using System;

public class Employé {

// m_Nom peut être accédé dans les méthodes des classes dérivées.

protected string m_Nom;

public Employé(string Nom) {m_Nom = Nom;}

public virtual void GetDescription()

{Console.Write("Nom: {0}",m_Nom);}

}

class Technicien : Employé{ // Technicien hérite de Employé.

public Cechnicien(string Nom):base(Nom) {}

public override void GetDescription(){

// Appel de la méthode GetDescription() de Employé.

base.GetDescription();

Console.Write(" Fonction: Cechnicien\n");}

}

class Secrétaire : Employé{ // Secrétaire hérite de Employé.

public Secrétaire(string Nom):base(Nom) {}

public override void GetDescription(){

// Appel de la méthode GetDescription() de Employé.

base.GetDescription();

Console.Write(" Fonction: Secrétaire\n");}

}

Page 34: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

34

Méthodes virtuelles et polymorphisme Méthodes virtuelles et polymorphisme (3/3(3/3))

Héritage, polymorphismes & interfaces

...

class Prog

{

static void Main(string[] args)

{

Employé [] Tab = new Employé[3];

Tab[0] = new Technicien("Roger");

Tab[1] = new Secrétaire("Lise");

Tab[2] = new Technicien("Raymond");

foreach( CEmployé e in Tab )

e.GetDescription();

}

}

Nom: Roger Fonction: Technicien

Nom: Lise Fonction: Secretaire

Nom: Raymond Fonction: Technicien

Ce programme affiche: Ce programme affiche:

Page 35: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

35

La problématique de La problématique de l’abstractionl’abstraction

Il arrive que l’on n’ait pas de code à mettre Il arrive que l’on n’ait pas de code à mettre dans la méthode virtuelle parce qu’il y a un dans la méthode virtuelle parce qu’il y a un manque d’information à ce niveau de l’arbre manque d’information à ce niveau de l’arbre d’héritage. d’héritage.

Par exemple pour la classe Par exemple pour la classe FigureGéométrique il n’y a rien à mettre dans il n’y a rien à mettre dans la méthode virtuelle la méthode virtuelle Dessine(). En effet, à ce . En effet, à ce niveau de l’héritage on ne sait pas quel type niveau de l’héritage on ne sait pas quel type de figure géométrique on instancie.de figure géométrique on instancie.

Une telle classe de base veut imposer des Une telle classe de base veut imposer des opérations à ces classes dérivées, alors qu’elle opérations à ces classes dérivées, alors qu’elle même n’a pas assez d’informations pour même n’a pas assez d’informations pour effectuer ces opérations, même en partie.effectuer ces opérations, même en partie.

Héritage, polymorphismes & interfaces

Page 36: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

36

L’abstractionL’abstraction Une Une classe abstraiteclasse abstraite est une classe qui doit est une classe qui doit

déléguer complètement l’implémentation déléguer complètement l’implémentation de certaines de ces méthodes à ses classes de certaines de ces méthodes à ses classes dérivées.dérivées.

Ces méthodes qui ne peuvent être Ces méthodes qui ne peuvent être implémentées s’appellent des implémentées s’appellent des méthodes méthodes abstraitesabstraites (ou (ou virtuelles puresvirtuelles pures).).

La conséquence fondamentale: La conséquence fondamentale: une classe une classe abstraite n’est pas instanciable.abstraite n’est pas instanciable.

Une autre conséquence est qu’une méthode Une autre conséquence est qu’une méthode abstraite ne doit pas avoir une visibilité abstraite ne doit pas avoir une visibilité privée.privée.

Héritage, polymorphismes & interfaces

Page 37: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

37

Exemple: L’abstractionExemple: L’abstractionHéritage, polymorphismes & interfaces

abstract class FigureGéométrique

{

public abstract void Dessine();

}

class Cercle : FigureGéométrique

{

private Point Centre;

private double Rayon;

public Cercle( Point Centre, double Rayon)

{this.Centre = Centre;this.Rayon = Rayon;}

public override void Dessine ()

{

// dessine un Cercle à partir de son centre et de son rayon

}

}

...

// erreur de compilation !

// ne peut instancier une classe abstraite !

FigureGéométrique UneFigure = new CFigureGéométrique();

// OK

FigureGéométrique UneFigure = new Cercle(new Point(1,2),3);

...

Page 38: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

38

Les interfacesLes interfaces Il existe des classes abstraites très particulières. Il existe des classes abstraites très particulières.

Ce sont celles qui n’ont que des méthodes Ce sont celles qui n’ont que des méthodes abstraites.abstraites.

En POO on les appelle les En POO on les appelle les interfaces interfaces ouou abstractionabstraction..

On dit qu’On dit qu’une classe implémente une interfaceune classe implémente une interface au au lieu de ‘dérive d’une interface’.lieu de ‘dérive d’une interface’.

Le point fondamentale: Le point fondamentale: une classe peut une classe peut implémenter plusieurs interfacesimplémenter plusieurs interfaces (et/ou (et/ou dériver d’une seule classe de base).dériver d’une seule classe de base).

Dans la déclaration d’une interface, les méthodes Dans la déclaration d’une interface, les méthodes ne peuvent avoir de niveau de visibilité. C’est aux ne peuvent avoir de niveau de visibilité. C’est aux classes qui l’implémentent d’en décider.classes qui l’implémentent d’en décider.

Héritage, polymorphismes & interfaces

Page 39: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

39

Exemple: Les interfacesExemple: Les interfacesHéritage, polymorphismes & interfaces

using System;

interface IA{void f(int i);}

interface IB{void g(double d);}

class C : IA, IB

{

public void f(int i) { Console.WriteLine("f de C {0}",i);}

public void g(double d){ Console.WriteLine("g de C {0}",d);}

}

class Prog

{

static void Main(string[] args)

{

// une référence interface sur un objet

IA Obj1 = new C();

// une référence interface sur un objet

IB Obj2 = new C();

// récupération de l'objet d'après une référence interface

C RefSurObj2 = (C) Obj2;

Obj1.f(5);

}

}

Page 40: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

40

Les opérateurs is et asLes opérateurs is et as L’opérateur L’opérateur is sert à déterminer à sert à déterminer à

l’exécution si une expression peut être l’exécution si une expression peut être transtypée (castée) dans un type donné. transtypée (castée) dans un type donné. Cet opérateur retourne un booléen.Cet opérateur retourne un booléen.

Après avoir déterminé à l’exécution si une Après avoir déterminé à l’exécution si une expression peut être transtypée (castée) expression peut être transtypée (castée) dans un type donné avec l’opérateur dans un type donné avec l’opérateur is, on , on réalise effectivement le transtypage la réalise effectivement le transtypage la plupart du temps. L’opérateur plupart du temps. L’opérateur as permet permet d’effectuer ces deux étapes. Si le d’effectuer ces deux étapes. Si le transtypage ne peut avoir lieu, la référence transtypage ne peut avoir lieu, la référence nulle est retournée. nulle est retournée.

Héritage, polymorphismes & interfaces

Page 41: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

41

Exemple: Les opérateurs is et Exemple: Les opérateurs is et asas

Héritage, polymorphismes & interfaces

...

static void Main(string[] args)

{

IA RefA = new C();

IB RefB = null;

IEnumerator RefE = null;

C RefC = null;

// Ici, le transtypage peut se faire.

if( RefA is C ){ RefC = (C)RefA; // utilise RefC... }

// équivalent à

RefC = RefA as C;

if( RefC != null ){// utilise RefC...}

// Ici, le transtypage ne peut pas se faire.

if( RefA is IEnumerator ){ RefE = (IEnumerator)RefA; // utilise RefE... }

// équivalent à

RefE = RefA as IEnumerator ;

if( RefE != null ){// utilise RefE...}

}

Page 42: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

42

PlanPlan

Eléments de baseEléments de baseStructures de contrôleStructures de contrôleClasses & objetsClasses & objetsHéritage, polymorphisme & Héritage, polymorphisme &

interfacesinterfacesExceptionsExceptionsAutres éléments de C#Autres éléments de C#

Page 43: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

43

La problématique (1/2)La problématique (1/2) Les applications doivent faire face à des Les applications doivent faire face à des

situations exceptionnelles indépendantes du situations exceptionnelles indépendantes du programmeur. Par exemple :programmeur. Par exemple : Accéder à un fichier qui n’existe pas ou plus.Accéder à un fichier qui n’existe pas ou plus. Faire face à une demande d’allocation de mémoire Faire face à une demande d’allocation de mémoire

alors qu’il n’y en a plus.alors qu’il n’y en a plus. Accéder à un serveur qui n’est plus disponible.Accéder à un serveur qui n’est plus disponible. Accéder à une ressource sans en avoir les droits.Accéder à une ressource sans en avoir les droits. Entrée d’un paramètre invalide par l’utilisateur Entrée d’un paramètre invalide par l’utilisateur

(une date de naissance en l’an 3000 par exemple).(une date de naissance en l’an 3000 par exemple). Ces situations, qui ne sont pas des bugs mais Ces situations, qui ne sont pas des bugs mais

que l’on peut appeler erreurs, engendrent que l’on peut appeler erreurs, engendrent cependant un arrêt du programme, à moins cependant un arrêt du programme, à moins qu’elles ne soient traitées. qu’elles ne soient traitées.

Exceptions

Page 44: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

44

La problématique (2/2)La problématique (2/2) Pour traiter ces situations on peut tester Pour traiter ces situations on peut tester

les codes d’erreur retournés par les les codes d’erreur retournés par les fonctions critiques, mais ceci présente fonctions critiques, mais ceci présente deux inconvénients :deux inconvénients : Le code devient lourd, puisque chaque appel à Le code devient lourd, puisque chaque appel à

une fonction critique est suivi de nombreux une fonction critique est suivi de nombreux tests. Les tests ne sont pas centralisés.tests. Les tests ne sont pas centralisés.

Le programmeur doit prévoir toutes les Le programmeur doit prévoir toutes les situations possibles dès la conception du situations possibles dès la conception du programme. Il doit aussi définir les réactions programme. Il doit aussi définir les réactions du programme et les traitements à effectuer du programme et les traitements à effectuer pour chaque type d’erreur. Il ne peut pas pour chaque type d’erreur. Il ne peut pas simplement factoriser plusieurs types d’erreur simplement factoriser plusieurs types d’erreur en un seul traitement.en un seul traitement.

En fait ces inconvénients sont En fait ces inconvénients sont majeurs.majeurs.

Exceptions

Page 45: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

45

La solution: les exceptionsLa solution: les exceptions Voici les étapes dans la gestion d’une exception :Voici les étapes dans la gestion d’une exception :

Une erreur survient ; Une erreur survient ; On construit un objet qui contient, éventuellement, des On construit un objet qui contient, éventuellement, des

paramètres descriptifs de l’erreur. La classe d’un tel paramètres descriptifs de l’erreur. La classe d’un tel objet est obligatoirement fille de la classe objet est obligatoirement fille de la classe System.Exception (directement ou indirectement) ; (directement ou indirectement) ;

Une exception est lancée. Elle est paramétrée par Une exception est lancée. Elle est paramétrée par l’objet ;l’objet ;

Deux possibilités peuvent alors survenir à ce moment :Deux possibilités peuvent alors survenir à ce moment :A) Un gestionnaire d’exception rattrape A) Un gestionnaire d’exception rattrape

l’exception. Il l’analyse l’exception. Il l’analyse et a la possibilité d’exécuter et a la possibilité d’exécuter du code, par exemple pour sauver du code, par exemple pour sauver des données ou des données ou avertir l’utilisateur.avertir l’utilisateur.

B) Aucun gestionnaire d’exception ne rattrape B) Aucun gestionnaire d’exception ne rattrape l’exception. Le l’exception. Le programme se termine. programme se termine.

Exceptions

Page 46: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

46

Exemple: les exceptionsExemple: les exceptions

Exceptions

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!");

}

}

}

Page 47: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

47

Le gestionnaire Le gestionnaire d’exceptiond’exception

Un gestionnaire d’exception peut contenir une ou Un gestionnaire d’exception peut contenir une ou plusieurs clauses plusieurs clauses catch, et/ou une clause , et/ou une clause finally.

La clause La clause finally est toujours exécutée, quelle que est toujours exécutée, quelle que soit l’issue.soit l’issue.

Une exception lancée, instance d’une classe dérivée Une exception lancée, instance d’une classe dérivée D de la classe de base de la classe de base B, matche à la fois la clause , matche à la fois la clause catch(D d) et la clause et la clause catch(B b). D’o. D’oùù:: Dans le même gestionnaire d’exception, le compilateur Dans le même gestionnaire d’exception, le compilateur

interdit les clauses catch de classes dérivées de B, après la interdit les clauses catch de classes dérivées de B, après la définition d’une clause définition d’une clause catch(B b)..

La clause La clause catch(System.Exception) rattrape toutes les rattrape toutes les exceptions puisque toutes les classes d’exception dérivent exceptions puisque toutes les classes d’exception dérivent de la classe de la classe System.Exception. Si elle est présente dans . Si elle est présente dans un gestionnaire d’exception, elle constitue forcément la un gestionnaire d’exception, elle constitue forcément la dernière clause catch.dernière clause catch.

Exceptions

Page 48: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

48

Exceptions propriétairesExceptions propriétaires Le framework .NET définit de nombreuses Le framework .NET définit de nombreuses

exceptions mais vous pouvez définir vos propres exceptions mais vous pouvez définir vos propres classes d’exceptions (qui doivent elles aussi classes d’exceptions (qui doivent elles aussi dériver de la classe dériver de la classe System.Exception).).

Exceptions

using System;

public class ExceptionArgEntierHorsLimite : Exception{

public ExceptionArgEntierHorsLimite( int Entier , int Inf , int Sup ):

base(string.Format("L'argument {0} est hors de l'intervalle [{1},{2}]",

Entier,Inf,Sup)){}

}

class Prog{

static void f(int i)

{if( i<10 || i>50 )throw new ExceptionArgEntierHorsLimite(i,10,50);}

public static void Main()

{

try{f(60);}

catch(ExceptionArgEntierHorsLimite e)

{Console.WriteLine("Exception: "+e.Message);}

}

}

Page 49: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

49

PlanPlan

Eléments de baseEléments de baseStructures de contrôleStructures de contrôleClasses & objetsClasses & objetsHéritage, polymorphisme & Héritage, polymorphisme &

interfacesinterfacesExceptionsExceptionsAutres éléments de C#Autres éléments de C#

Page 50: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

50

Les tableauxLes tableaux C# permet la création et l’utilisation de tableaux à une ou C# permet la création et l’utilisation de tableaux à une ou

plusieurs dimensions.plusieurs dimensions.

Les types de tableaux sont tous des types référence. En fait Les types de tableaux sont tous des types référence. En fait

chaque type de tableau est une classe qui hérite de la chaque type de tableau est une classe qui hérite de la classe abstraite classe abstraite System.Array. .

C# oblige tous les éléments d’un tableau à avoir le même C# oblige tous les éléments d’un tableau à avoir le même type. Cette contrainte peut être facilement contournée. Il type. Cette contrainte peut être facilement contournée. Il suffit de spécifier que les éléments sont des références vers suffit de spécifier que les éléments sont des références vers une classe de base, pour qu’en fait, chaque élément puisse une classe de base, pour qu’en fait, chaque élément puisse être une référence vers un objet de n’importe quelle classe être une référence vers un objet de n’importe quelle classe dérivée.dérivée.

Autres éléments de C#

int [] r1; // r1 est une référence vers un tableau d'entiers de dimension 1

int [,] r2; // r2 est une référence vers un tableau d'entiers de dimension 2

double [,,,] r4;//r4 est une référence vers un tableau de doubles dimension 4

Page 51: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

51

Le mot clé lockLe mot clé lock Le langage C# présente le mot-clé lock qui remplace Le langage C# présente le mot-clé lock qui remplace

élégamment l’utilisation des méthode élégamment l’utilisation des méthode Enter() et et Exit() de la classe de la classe System.Threading.Monitor qui définissent qui définissent une une section critiquesection critique (i.e une portion de code accessible par (i.e une portion de code accessible par un seul thread à la fois). un seul thread à la fois).

Autres éléments de C#

lock( typeof(Prog) )

{

Compteur*=Compteur;

}

try

{

Monitor.Enter( typeof(Prog) );

Compteur*=2;

}

finally

{

Monitor.Exit( typeof(Prog) );

}

Page 52: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

52

Le préprocesseurLe préprocesseur

Toute compilation d’un fichier source est Toute compilation d’un fichier source est précédée d'une phase de mise en forme du précédée d'une phase de mise en forme du fichier. Celle-ci est effectuée par un fichier. Celle-ci est effectuée par un préprocesseur. préprocesseur.

Il n'effectue que des traitements simples de Il n'effectue que des traitements simples de manipulation textuelle. En aucun cas le manipulation textuelle. En aucun cas le préprocesseur n'est chargé de la compilation. préprocesseur n'est chargé de la compilation.

Toutes les Toutes les directivesdirectives préprocesseurpréprocesseur sont sont précédées par le caractère #. Le préprocesseur précédées par le caractère #. Le préprocesseur reconnaît les directives suivantes :reconnaît les directives suivantes :#define #undef #if #elif #else #endif #error #warning #line #region #endregion

Autres éléments de C#

Page 53: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

53

Les délégués et les Les délégués et les évènementsévènements

C# permet la création de classes particulières C# permet la création de classes particulières avec le mot-clé delegate en post-fixe. On avec le mot-clé delegate en post-fixe. On appelle ces classes appelle ces classes délégationsdélégations. Les instances . Les instances des délégations sont appelées des délégations sont appelées déléguésdélégués. .

Conceptuellement, un délégué est une Conceptuellement, un délégué est une référence vers une ou plusieurs méthodes référence vers une ou plusieurs méthodes (statiques ou non). On peut donc ‘appeler’ un (statiques ou non). On peut donc ‘appeler’ un délégué avec la même syntaxe que l’appel délégué avec la même syntaxe que l’appel d’une méthode. Ceci provoque l’appel des d’une méthode. Ceci provoque l’appel des méthodes référencées. méthodes référencées.

La notion d’événement utilise les délégués La notion d’événement utilise les délégués pour stocker les méthodes à appeler lorsque pour stocker les méthodes à appeler lorsque l’événement est déclenché.l’événement est déclenché.

Autres éléments de C#

Page 54: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

54

Surcharge des Surcharge des opérateursopérateurs

C# permet la surcharge d’opérateurs C# permet la surcharge d’opérateurs dans des classes:dans des classes: Les opérateurs arithmétiques:Les opérateurs arithmétiques:

unaires: unaires: + - ! ~ ++ --binaires:binaires:+ - * / % & | ^ << >>

Les opérateurs de conversion de type Les opérateurs de conversion de type (appelés aussi opérateurs de transtypage.(appelés aussi opérateurs de transtypage.

Les opérateurs de comparaison: Les opérateurs de comparaison: == != < > <= >=

Autres éléments de C#

Page 55: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

55

Mode non protégé (1/2)Mode non protégé (1/2)

Le CLR s’occupe entièrement de la Le CLR s’occupe entièrement de la gestion de la mémoire (ramasse-gestion de la mémoire (ramasse-miettes, allocations…)miettes, allocations…)

Mode non protégé = possibilité de Mode non protégé = possibilité de désactiver momentanément la désactiver momentanément la gestion de la mémoire par le CLRgestion de la mémoire par le CLR

Une conséquence: En mode protégé Une conséquence: En mode protégé on peut utiliser des pointeurson peut utiliser des pointeurs

Autres éléments de C#

Page 56: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

56

Mode non protégé (2/2)Mode non protégé (2/2)Exemple d’utilisation: traitement Exemple d’utilisation: traitement

d’imagesd’images

Mode géré... for( int y=0 ; y<Y ; y++ ) for( int x=0 ; x<X ; x++ ){ cSrc = m_Bmp.GetPixel(x,y) ; cDest= Color.FromArgb( 255-cSrc.R,255-cSrc.G,255-cSrc.B); m_Bmp.SetPixel(x,y,cDest) ; }...

Mode non protégé

...

unsafe{

StructPixel *pBmp =(StructPixel*)BmpData.Scan0;

for( int y=0 ; y<Y ; y++ ){

pCurrent = pBmp + y*X;

for( int x=0 ; x<X ; x++ ){

pCurrent->R=(byte)(255 - pCurrent->R);

pCurrent->G=(byte)(255 - pCurrent->G);

pCurrent->B=(byte)(255 - pCurrent->B);

pCurrent++ ;

}

}

}

...

Facteur = x 97

Autres éléments de C#

Page 57: Formation universitaire à.NET: Introduction à C# Formation universitaire à.NET: Introduction à C# © Patrick SMACCHIA  © Patrick.

Introduction à C#

57

Question?Question? Mots clésMots clés : espace de noms ; point d’entrée ; : espace de noms ; point d’entrée ;

documentation automatique ; POO ; classe ; documentation automatique ; POO ; classe ; structure ; membre d’une classe ; instance d’une structure ; membre d’une classe ; instance d’une classe ; champ ; méthode ; propriété ; indexeur ; classe ; champ ; méthode ; propriété ; indexeur ; événement ; encapsulation ; niveau de visibilité ; événement ; encapsulation ; niveau de visibilité ; constructeur ; destructeur ; IDisposable ; constructeur ; destructeur ; IDisposable ; membres statiques ; mot-clé this ; héritage ; membres statiques ; mot-clé this ; héritage ; classe de base ; super-classe ; classe dérivée ; classe de base ; super-classe ; classe dérivée ; UML ; méthode virtuelle ; polymorphisme ; classe UML ; méthode virtuelle ; polymorphisme ; classe abstraite ; méthode abstraite ou virtuelle pure ; abstraite ; méthode abstraite ou virtuelle pure ; interface ; mot-clé is et as ; exceptions ; tableau ; interface ; mot-clé is et as ; exceptions ; tableau ; mot-clé lock ; section critique ; préprocesseur ; mot-clé lock ; section critique ; préprocesseur ; délégation ; délégué ; mode non protégé ; mot-délégation ; délégué ; mode non protégé ; mot-clé unsafeclé unsafe