Formation universitaire à .NET: Introduction à C#

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Structure de base des programmes en C.
GEF 243B Programmation informatique appliquée
Premier programme en C :
La boucle for : init7.c et init71.c
Les fonctions A quoi ça sert ?
Langage C# et Plate-forme .NET
Conception de Site Webs dynamiques Cours 5
Algorithmes et structures de données avancées Partie Conception de Sites Web dynamiques Cours 9 Patrick Reuter.
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
(Classes prédéfinies – API Java)
L’ interruption de boucle
Programmer en JAVA par Tama
MIKHAYLOVA Vera Exposé Java principe de fonctionnement Lundi 17 mai 2004 DEUG 1ère année Science du langage Paris III.
LICENCE MIAGE Introduction Programmation Orientée Objet JAVA philippe
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
JSP Java Server Pages. Introduction Afin dimplémenter les règles métiers, coté serveur dans une application Web, larchitecture Java propose trois solutions.
Les fonctions en Java Partie I Le type void. Dans cette rapide présentation, je vais expliquer :.à quoi servent les fonctions.à quoi faut-il penser avant.
Principes de programmation (suite)
CPI/BTS 2 Programmation Web Introduction au PHP
Cours de programmation
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Concepts de base : la Classe Pour faire une comparaison simple, une classe serait a priori, une structure C avec des variables et des fonctions.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction.
Introduction à la programmation (Java)
Langage Oriente Objet Cours 2.
Structures de données IFT Abder Alikacem La classe string Département dinformatique et de génie logiciel Édition Septembre 2009 Département dinformatique.
IFT 6800 Atelier en Technologies d’information
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
COURS DE PROGRAMMATION ORIENTEE OBJET :
COURS DE PROGRAMMATION ORIENTEE OBJET :
Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI) Plate-forme.NET.
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
2.1 - Historique Chapitre 2 : Introduction au langage C++
Exploration de la programmation android Formation Assurer par: Club FreeWays Réalisé par: BOUHJJA Lamia.
Cours 1 1 Java. Cours 1 2 Plan général 1.Introduction 2.Les types primitifs, évaluation d’expressions 3.Instructions for, if…. 4.Introduction de l’objet,
La notion de type revisitée en POO
GESTION ET TRAITEMENT DES ERREURS
Java : Exceptions H Batatia. 5/03/2004Java12: H.Batatia2 Exemple 1 public class Bonjour { public static void main(String[] args) { System.out.println("Bonjour.
11/04/ L'héritage Cours 7 Cours 7.
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Créer des packages.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
Introduction à Visual Studio C++ (VC++)
 Syntaxe du langage PHP
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
Tutorat en bio-informatique
Programmation Système et Réseau
Introduction au langage C Fonctions et Procédures
MOCK.
1 PHP 5 Notions fondamentales (niveau 1 – cours #2) Formation continue – Cégep de Sainte-Foy.
**Sous-titre du module Campus-Booster ID : **XXXXX Copyright © SUPINFO. All rights reserved Notions fondamentales du C# 2.0.
6ième Classe (Mercredi, 17 novembre) CSI2572
1. Spoon Christophe Delagarde, septembre 1998 I.U.T., Université de la Méditerrainée 2.
Héritage Conception par Objet et programmation Java
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 2 – Java Premiers pas Master 1 SIGLIS1 Java Lecteur - Chapitre 2 - Java Premiers Pas.
Scripts et fonctions Instructions de contrôle
1 PHP 5 Notions fondamentales (niveau 1 cours #3) Formation continue – Cégep de Sainte-Foy François G Couillard.
22 Concepts de base du langage Java. 2-2 Objectifs A la fin de ce cours, vous serez capables de : Identifier les éléments essentiels de Java Identifier.
pour les programmeurs en C++ Java 2 Part 1 3 Histoire de Java Projet de connexion des machines: 1991 Le nom Java a été introduit dans un café Développé.
Initiation aux bases de données et à la programmation événementielle
Exception Handling "Unfortunately, it's almost accepted practice to ignore error conditions, as if we're in a state of denial about errors." Bruce Eckel.
Transcription de la présentation:

Formation universitaire à .NET: Introduction à C# © 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. Contacter moi avant toute utilisation non personnelle de ces supports : patrick@smacchia.com L'architecture .NET : Introduction

Plan Eléments de base Structures de contrôle Classes & objets Héritage, polymorphisme & interfaces Exceptions Autres éléments de C# Introduction à C#

Les espaces de noms Eléments de base Une ressource dans le code source a la possibilité d’être déclarée et définie à l’intérieur d’un espace de noms. Si une ressource n’est déclarée dans aucun espace de noms elle fait partie d’un espace de noms global et anonyme. using 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 } Introduction à C# L'architecture .NET : Introduction

Organisation du code source Eléments de base Organisation du code source Projet … FichierN.cs Fichier1.cs Fichier2.cs Namespace 1 Namespace 2 Ressource B Namespace M Ressource A Ressource C Ressource D Introduction à C# L'architecture .NET : Introduction

Eléments de base La méthode Main() (1/2) Chaque assemblage exécutable a au moins une méthode statique Main() dans une de ses classes. Cette méthode représente le point d’entrée du programme, c’est-à-dire que le thread principal créé automatiquement lorsque le processus se lance va commencer par exécuter le code de cette méthode. Il peut y avoir éventuellement plusieurs méthodes Main() (chacune dans une classe différente) par programme. Le cas échéant, il faut préciser au compilateur quelle méthode Main() constitue le point d’entrée du programme. Introduction à C# L'architecture .NET : Introduction

La méthode Main() (2/2) Eléments de base Le programme suivant ajoute les nombres passés en arguments en ligne de commande, et affiche le résultat. S’il n’y a pas d’argument, le programme le signale :  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); } Introduction à C# L'architecture .NET : Introduction

Eléments de base Les commentaires Il existe trois façons de commenter du texte dans un fichier source C# : Le texte placé entre les balises /* suivie de */ est commenté. Ces balises peuvent éventuellement se trouver sur deux lignes différentes. Si une ligne contient la balise // alors le texte de cette ligne qui suit cette balise est commenté. Si une ligne contient la balise /// alors le texte de cette ligne qui suit cette balise est commenté. De plus ce texte fera partie de la documentation automatique. Introduction à C# L'architecture .NET : Introduction

Plan Eléments de base Structures de contrôle Classes & objets Héritage, polymorphisme & interfaces Exceptions Autres éléments de C# Introduction à C#

Définition Structures de contrôle Une structure de contrôle est un élément du programme qui change le comportement par défaut de l’unité d’exécution (du thread). Rappelons que ce comportement par défaut est d’exécuter les instructions les unes à la suite des autres. Trois familles de structures de contrôles: Les conditions, qui exécutent (ou pas) un bloc de code qu’à une certaine condition, portant généralement sur les états de variables et d’objets. Les boucles, qui exécutent en boucle un bloc d’instructions. Le programmeur a le choix entre terminer de boucler après un certain nombre d’itérations, ou terminer de boucler à une certaine condition. Les branchements ou sauts, qui permettent de rediriger directement vers une instruction particulière l’unité d’exécution. Introduction à C# L'architecture .NET : Introduction

Les conditions Structures de contrôle Trois types de condition: if/else switch L’opérateur ternaire ?: 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"); default:Console.WriteLine("i ne vaut ni 1 ni 6"); } Introduction à C# L'architecture .NET : Introduction

Les boucles Structures de contrôle Quatre types de boucle: while do/while for foreach int i=0;int j=8; while( i < 6 && j > 9 ) { i++;j--; } 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 i=0;int j=8; do { i++;j--; } while( i < 6 && j > 9) 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 Introduction à C# L'architecture .NET : Introduction

Plan Eléments de base Structures de contrôle Classes & objets Héritage, polymorphisme & interfaces Exceptions Autres éléments de C# Introduction à C#

La Programmation Orientée Objet (POO ou OOP) Classes & objets La Programmation Orientée Objet (POO ou OOP) Le concept de la programmation fonctionnelle est construit autour de la notion de fonction. Tout programme est un ensemble de fonctions s’appelant entre elles. Le concept de la programmation objet est construit autour des notions d’objet et de classe. Une classe est l’implémentation d’un type de données (au même titre que int ou une structure). Un objet est une instance d’une classe. L’avantage majeur de la POO sur la Programmation fonctionnelle est de réunir les données avec leurs traitements. Introduction à C# L'architecture .NET : Introduction

Classe et membre Exemple de déclaration. Classes & objets Classe et membre Exemple de déclaration. Les membres d’une classe sont des entités déclarées dans la classe. 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. Introduction à C# L'architecture .NET : Introduction

Classes & objets Structures vs. Classes La déclaration d’une structure se fait avec le mot clé struct à la place de class. La principale différence est qu’une structure définit un type valeur alors qu’une classe définit un type référence. Une autre différence est que les structures ne connaissent pas la notion d’héritage d’implémentation (voir plus loin). Une référence vers une instance d’une structure peut être obtenue avec l’opération de boxing. Introduction à C# L'architecture .NET : Introduction

Les membres d’une classe Classes & objets Les membres d’une classe Six types de membres d’une classe: Les champs : un champs d’une classe définit une donnée (type valeur) ou une référence vers une donnée (type référence) qui existe pour toute instance de la classe. Les méthodes : peut être vu comme un traitement sur les données d’un objet. Les propriétés : peut être vu comme un couple de méthode pour intercepter les accès (lecture/écriture) aux données d’un objet avec la syntaxe d’accès aux champs. Les indexeurs : propriété spéciale utilisant la syntaxe d’accès à un tableau []. Les événements : facilite l’implémentation de la notion de programmation événementielle. Les types encapsulés dans la classe. Introduction à C# L'architecture .NET : Introduction

Encapsulation et niveau de visibilité Classes & objets Encapsulation et niveau de visibilité Introduction à C# L'architecture .NET : Introduction

Exemple: Propriétés, champs niveau de visibilité Classes & objets Exemple: Propriétés, champs niveau de visibilité 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é. Introduction à C# L'architecture .NET : Introduction

Les constructeurs Classes & objets Une méthode est automatiquement appelée lorsque l’objet est construit. On appelle ce type de méthode un constructeur (ctor en abrégé). En C#, syntaxiquement, une méthode constructeur porte le nom de la classe, et ne retourne rien (même pas le type void). Pour chaque classe il peut y avoir : Aucun constructeur : dans ce cas le compilateur fournit automatiquement un constructeur par défaut, qui n’accepte aucun argument. Un seul constructeur : dans ce cas, ce sera toujours lui qui sera appelé. Le compilateur ne fournit pas de constructeur par défaut. Plusieurs constructeurs : dans ce cas ils diffèrent selon leurs signatures (i.e nombre et type des arguments). Le compilateur ne fournit pas de constructeur par défaut. Lorsqu’une méthode constructeur retourne, il est impératif que tous les champs de type valeur de la classe aient été initialisés. Un constructeur admet un niveau de visibilité. Introduction à C# L'architecture .NET : Introduction

Le destructeur Classes & objets On nomme destructeur la méthode de la classe qui est appelée par le ramasse-miettes juste avant qu’il désalloue la zone mémoire du tas occupée par l’objet. 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 destructeur par défaut. Un destructeur est une méthode non statique avec le même nom que sa classe, et commençant par le caractère tilde ‘~’. Syntaxiquement, un destructeur n’admet pas d’argument et ne retourne aucun type, même pas le type void. En interne, le compilateur C# fait en sorte qu’un destructeur est la réécriture de la méthode Finalize() de la classe Object. Un destructeur n’admet pas de niveau de visibilité. Introduction à C# L'architecture .NET : Introduction

Exemple: Construction et destruction des objets Classes & objets Exemple: Construction et destruction des 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 Introduction à C# L'architecture .NET : Introduction

L’interface IDisposable Classes & objets L’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. 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. Introduction à C# L'architecture .NET : Introduction

Les membres statiques Classes & objets Les champs, les propriétés, les méthodes (y compris les constructeurs mais pas le destructeur) et les événements d’une classe ont la possibilité d’être déclaré avec le mot-clé static. Ce mot-clé signifie que le membre appartient à la classe, et non aux objets, comme c’est le cas des membres non statiques. Un membre statique a un niveau de visibilité. Une méthode statique n’a pas accès aux méthodes, champs, propriétés et événements non statiques de la classe. Une méthode statique n’est pas accessible à partir d’une référence vers une méthode de la classe. Une méthode statique est accessible dans toutes les 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) par la syntaxe : NomDeLaClasse.NomDeLaMéthodeStatique() Introduction à C# L'architecture .NET : Introduction

Exemple: Membres statiques Classes & objets Exemple: Membres statiques 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--; Introduction à C# L'architecture .NET : Introduction

Classes & objets Le mot clé this Dans toutes les méthodes non statiques, C# permet d’utiliser le mot-clé this. Ce mot-clé est une référence vers l’objet sur lequel opère la méthode courante. L’utilisation de ce mot clé témoigne en général d’une architecture objet évoluée : class UneClasse { void fct() // méthode non statique fct2(this); } static void fct2(UneClasse A ) // travaille avec l’objet référencé par A... Introduction à C# L'architecture .NET : Introduction

Plan Eléments de base Structures de contrôle Classes & objets Héritage, polymorphisme & interfaces Exceptions Autres éléments de C# Introduction à C#

La problèmatique (1/2) Héritage, polymorphismes & interfaces La complexité d’un programme en fonction de sa taille, grandit plus vite qu’une fonction linéaire de sa taille. Le travail de l’architecte (le designer) d’un programme consiste à ce que la complexité reste aussi proche que possible de la fonction linéaire. Le mécanisme de dérivation ou d’héritage, est un des points clés de la programmation objet. Introduction à C# L'architecture .NET : Introduction

La problèmatique (2/2) Héritage, polymorphismes & interfaces Souvent, dans une application, des classes ont des membres similaires car elles sont sémantiquement proche: Les classes Secrétaire, Technicien et Cadre peuvent avoir en commun les champs Nom, Age, Adresse et Salaire et les méthodes Evalue() et Augmente(). Les classes Carré, Triangle et Cercle peuvent avoir en commun les champs CouleurDuTrait et TailleDuTrait et les méthodes Dessine(), Translation() et Rotation(). Les classes Button, ComboBox et EditBox peuvent avoir en commun les champs Position et Enabled et les méthodes OnClick() et OnMouseOver(). On comprend bien que c’est parce que: Une secrétaire, un technicien ou un cadre est un employé (i.e une spécialisation du concept d’employé). Un carré, un triangle ou un cercle est une forme géométrique. Un bouton, une combo-box ou une edit-box est un contrôle graphique. Introduction à C# L'architecture .NET : Introduction

La solution : L’héritage Héritage, polymorphismes & interfaces La solution : L’héritage L’idée de la réutilisation est de cerner ces similitudes, et de les encapsuler dans une classe appelée classe de base (par exemple Employé, FigureGéométrique ou Control). Les classes de base sont parfois appelées super classes. Une classe dérivée est une classe qui hérite des membres de la classe de base. Concrètement si Technicien hérite de Employé, Technicien hérite des champs Nom, Age, Adresse et Salaire et des méthodes Evalue() et Augmente(). On dit aussi que la classe dérivée est une spécialisation de la clase de base. Introduction à C# L'architecture .NET : Introduction

Exemple : L’héritage Hé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"); Introduction à C# L'architecture .NET : Introduction

Exemple : Schéma de dérivation Héritage, polymorphismes & interfaces Exemple : Schéma de dérivation Des normes telles que UML (Unified Modelling Language) permettent de faire des schéma pour représenter les liens entre les classes: CAnimal CMammifère CReptile CHumain CChien CLézard CBergerAllemand CLabrador CCaniche Introduction à C# L'architecture .NET : Introduction

Méthodes virtuelles et polymorphisme (1/3) Héritage, polymorphismes & interfaces Méthodes virtuelles et polymorphisme (1/3) En POO on est souvent confronté au problème suivant : On crée des objets, instances de plusieurs classes dérivées d’une classe de base, puis on veut leur appliquer un traitement de base, c’est-à-dire, un traitement défini dans la classe de base. Le problème est que ce traitement diffère selon la classe dérivée. Par exemple on veut obtenir une description de tous les employés (traitement de base : obtenir une description d’un employé, quelle que soit sa catégorie). Introduction à C# L'architecture .NET : Introduction

Méthodes virtuelles et polymorphisme (2/3) Héritage, polymorphismes & interfaces Méthodes virtuelles et polymorphisme (2/3) 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) {} Console.Write(" Fonction: Secrétaire\n");} Introduction à C# L'architecture .NET : Introduction

Méthodes virtuelles et polymorphisme (3/3) Héritage, polymorphismes & interfaces Méthodes virtuelles et polymorphisme (3/3) ... 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(); } Ce programme affiche: Nom: Roger Fonction: Technicien Nom: Lise Fonction: Secretaire Nom: Raymond Fonction: Technicien Introduction à C# L'architecture .NET : Introduction

La problématique de l’abstraction Héritage, polymorphismes & interfaces La problématique de l’abstraction Il arrive que l’on n’ait pas de code à mettre dans la méthode virtuelle parce qu’il y a un manque d’information à ce niveau de l’arbre d’héritage. Par exemple pour la classe FigureGéométrique il n’y a rien à mettre dans la méthode virtuelle Dessine(). En effet, à ce niveau de l’héritage on ne sait pas quel type de figure géométrique on instancie. Une telle classe de base veut imposer des opérations à ces classes dérivées, alors qu’elle même n’a pas assez d’informations pour effectuer ces opérations, même en partie. Introduction à C# L'architecture .NET : Introduction

Héritage, polymorphismes & interfaces L’abstraction Une classe abstraite est une classe qui doit déléguer complètement l’implémentation de certaines de ces méthodes à ses classes dérivées. Ces méthodes qui ne peuvent être implémentées s’appellent des méthodes abstraites (ou virtuelles pures). La conséquence fondamentale: une classe abstraite n’est pas instanciable. Une autre conséquence est qu’une méthode abstraite ne doit pas avoir une visibilité privée. Introduction à C# L'architecture .NET : Introduction

Exemple: L’abstraction Héritage, polymorphismes & interfaces Exemple: L’abstraction 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); Introduction à C# L'architecture .NET : Introduction

Les interfaces Héritage, polymorphismes & interfaces Il existe des classes abstraites très particulières. Ce sont celles qui n’ont que des méthodes abstraites. En POO on les appelle les interfaces ou abstraction. On dit qu’une classe implémente une interface au lieu de ‘dérive d’une interface’. Le point fondamentale: une classe peut implémenter plusieurs interfaces (et/ou dériver d’une seule classe de base). Dans la déclaration d’une interface, les méthodes ne peuvent avoir de niveau de visibilité. C’est aux classes qui l’implémentent d’en décider. Introduction à C# L'architecture .NET : Introduction

Exemple: Les interfaces Héritage, polymorphismes & interfaces Exemple: Les 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(); 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); Introduction à C# L'architecture .NET : Introduction

Héritage, polymorphismes & interfaces Les opérateurs is et as L’opérateur is sert à déterminer à l’exécution si une expression peut être transtypée (castée) dans un type donné. Cet opérateur retourne un booléen. Après avoir déterminé à l’exécution si une expression peut être transtypée (castée) dans un type donné avec l’opérateur is, on réalise effectivement le transtypage la plupart du temps. L’opérateur as permet d’effectuer ces deux étapes. Si le transtypage ne peut avoir lieu, la référence nulle est retournée. Introduction à C# L'architecture .NET : Introduction

Exemple: Les opérateurs is et as Héritage, polymorphismes & interfaces Exemple: Les opérateurs is et as ... 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... } RefE = RefA as IEnumerator ; if( RefE != null ){// utilise RefE...} } Introduction à C# L'architecture .NET : Introduction

Plan Eléments de base Structures de contrôle Classes & objets Héritage, polymorphisme & interfaces Exceptions Autres éléments de C# Introduction à C#

Exceptions La problématique (1/2) Les applications doivent faire face à des situations exceptionnelles indépendantes du programmeur. Par exemple : Accéder à un fichier qui n’existe pas ou plus. Faire face à une demande d’allocation de mémoire alors qu’il n’y en a plus. Accéder à un serveur qui n’est plus disponible. Accéder à une ressource sans en avoir les droits. Entrée d’un paramètre invalide par l’utilisateur (une date de naissance en l’an 3000 par exemple). Ces situations, qui ne sont pas des bugs mais que l’on peut appeler erreurs, engendrent cependant un arrêt du programme, à moins qu’elles ne soient traitées. Introduction à C# L'architecture .NET : Introduction

Exceptions La problématique (2/2) Pour traiter ces situations on peut tester les codes d’erreur retournés par les fonctions critiques, mais ceci présente deux inconvénients : Le code devient lourd, puisque chaque appel à une fonction critique est suivi de nombreux tests. Les tests ne sont pas centralisés. Le programmeur doit prévoir toutes les situations possibles dès la conception du programme. Il doit aussi définir les réactions du programme et les traitements à effectuer pour chaque type d’erreur. Il ne peut pas simplement factoriser plusieurs types d’erreur en un seul traitement. En fait ces inconvénients sont majeurs. Introduction à C# L'architecture .NET : Introduction

La solution: les exceptions Voici les étapes dans la gestion d’une exception : Une erreur survient ; On construit un objet qui contient, éventuellement, des paramètres descriptifs de l’erreur. La classe d’un tel objet est obligatoirement fille de la classe System.Exception (directement ou indirectement) ; Une exception est lancée. Elle est paramétrée par l’objet ; Deux possibilités peuvent alors survenir à ce moment : A) Un gestionnaire d’exception rattrape l’exception. Il l’analyse et a la possibilité d’exécuter du code, par exemple pour sauver des données ou avertir l’utilisateur. B) Aucun gestionnaire d’exception ne rattrape l’exception. Le programme se termine. Introduction à C# L'architecture .NET : Introduction

Exemple: les 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!"); Introduction à C# L'architecture .NET : Introduction

Le gestionnaire d’exception Exceptions Le gestionnaire d’exception Un gestionnaire d’exception peut contenir une ou plusieurs clauses catch, et/ou une clause finally. La clause finally est toujours exécutée, quelle que soit l’issue. Une exception lancée, instance d’une classe dérivée D de la classe de base B, matche à la fois la clause catch(D d) et la clause catch(B b). D’où: Dans le même gestionnaire d’exception, le compilateur interdit les clauses catch de classes dérivées de B, après la définition d’une clause catch(B b). La clause catch(System.Exception) rattrape toutes les exceptions puisque toutes les classes d’exception dérivent de la classe System.Exception. Si elle est présente dans un gestionnaire d’exception, elle constitue forcément la dernière clause catch. Introduction à C# L'architecture .NET : Introduction

Exceptions propriétaires Le framework .NET définit de nombreuses exceptions mais vous pouvez définir vos propres classes d’exceptions (qui doivent elles aussi dériver de la classe System.Exception). 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);} Introduction à C# L'architecture .NET : Introduction

Plan Eléments de base Structures de contrôle Classes & objets Héritage, polymorphisme & interfaces Exceptions Autres éléments de C# Introduction à C#

Les tableaux Autres éléments de C# C# permet la création et l’utilisation de tableaux à une ou plusieurs dimensions. 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 classe abstraite System.Array. C# oblige tous les éléments d’un tableau à avoir le même type. Cette contrainte peut être facilement contournée. Il 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 être une référence vers un objet de n’importe quelle classe dérivée. 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 Introduction à C# L'architecture .NET : Introduction

Le mot clé lock  Autres éléments de C# Le langage C# présente le mot-clé lock qui remplace élégamment l’utilisation des méthode Enter() et Exit() de la classe System.Threading.Monitor qui définissent une section critique (i.e une portion de code accessible par un seul thread à la fois).  try { Monitor.Enter( typeof(Prog) ); Compteur*=2; } finally Monitor.Exit( typeof(Prog) ); lock( typeof(Prog) ) { Compteur*=Compteur; } Introduction à C# L'architecture .NET : Introduction

Le préprocesseur Autres éléments de C# Toute compilation d’un fichier source est précédée d'une phase de mise en forme du fichier. Celle-ci est effectuée par un préprocesseur. Il n'effectue que des traitements simples de manipulation textuelle. En aucun cas le préprocesseur n'est chargé de la compilation. Toutes les directives préprocesseur sont précédées par le caractère #. Le préprocesseur reconnaît les directives suivantes : #define #undef #if #elif #else #endif #error #warning #line #region #endregion Introduction à C# L'architecture .NET : Introduction

Les délégués et les évènements Autres éléments de C# Les délégués et les évènements C# permet la création de classes particulières avec le mot-clé delegate en post-fixe. On appelle ces classes délégations. Les instances des délégations sont appelées délégués. Conceptuellement, un délégué est une référence vers une ou plusieurs méthodes (statiques ou non). On peut donc ‘appeler’ un délégué avec la même syntaxe que l’appel d’une méthode. Ceci provoque l’appel des méthodes référencées. La notion d’événement utilise les délégués pour stocker les méthodes à appeler lorsque l’événement est déclenché. Introduction à C# L'architecture .NET : Introduction

Surcharge des opérateurs Autres éléments de C# Surcharge des opérateurs C# permet la surcharge d’opérateurs dans des classes: Les opérateurs arithmétiques: unaires: + - ! ~ ++ -- binaires:+ - * / % & | ^ << >> Les opérateurs de conversion de type (appelés aussi opérateurs de transtypage. Les opérateurs de comparaison: == != < > <= >= Introduction à C# L'architecture .NET : Introduction

Autres éléments de C# Mode non protégé (1/2) Le CLR s’occupe entièrement de la gestion de la mémoire (ramasse-miettes, allocations…) Mode non protégé = possibilité de désactiver momentanément la gestion de la mémoire par le CLR Une conséquence: En mode protégé on peut utiliser des pointeurs Introduction à C#

Mode non protégé (2/2) Exemple d’utilisation: traitement d’images Autres éléments de C# Mode non protégé (2/2) Exemple d’utilisation: traitement d’images Facteur = x 97 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++ ; } 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) ; } Introduction à C#

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