Vous êtes sur la page 1sur 195

Support de Cours Visual C# 2.

0
propos par Nadia HADDOUCHE epse CHETTA

Part 1: Introduction Visual C# et Visual Studio 2005

Chapitre 1: Bienvenue Visual C#

Quelle est la structure dun programme C# ?


Lexcution du programme commence Main( ) Le mot cl using fait rfrence aux ressources dans la librairie des classes de .NET Framework Un programme est compos dinstructions Les instructions sont spares par des ; Les { } sont utilises pour grouper les instructions
using System; using System.Collections.Generic; using System.Text; namespace TextHello { class Program { static void Main(string[ ] args) { Console.WriteLine("Hello World"); } } }

Comment formater le Code en C#


Utiliser lindentation C# est case sensitive Les espaces blancs sont ignors Une ligne de commentaire est indique par //

Des lignes de commentaire sont limites par /* et */


using System; using System.Collections.Generic; using System.Text; namespace TextHello { class Program { static void Main(string[ ] args) { Console.WriteLine("Hello World"); } } }

Lutilisation les noms despace : Namespaces

Dclarer un namespace

namespace CompanyName { public class Customer () { } }

Namespaces imbriqus

namespace CompanyName { namespace Sales { public class Customer () { } } } // Or namespace CompanyName.Sales { ... }

La dclaration using

using System; using CompanyName.Sales;

Chapitre 2: Utiliser les variables, les oprateurs et les expressions

Les mots cl de C#

Quest un type prdfini?


Les Types sont utiliss pour dfinir des variables Les Variables stockent diffrent types de donnes Les types prdfinis sont ceux dfinis par C# et le .NET Framework

Vous pouvez dfinir les votre

Les Variables doivent tre dfinies avant de les utiliser Utiliser la camelCase convention pour nommer les variables

Les types prdfinis de C#

Comment dclarer et initialiser des variables


Dclaration
1 Affecter un type
2 Affecter un nom int numberOfVisitors; string bear;

3 Terminer par un ;

Initialisation
1

Utiliser loprateur = 2 Affecter une valeur 3 Terminer par un ;

string bear = "Grizzly";

Affecter des valeurs litrales decimal deposit = 100M;


1 Ajouter un suffixe de type

Comment dclarer et initialiser des chanes de caractres

Exemple de chane de caractre


string s = "Hello World"; // Hello World

Dclarer une chane entre guillemets


string s = "\"Hello\""; // "Hello"

Utiliser un retour chariot


string s = "Hello\nWorld"; // une ligne est ajoute

Utiliser des verbatim strings


string s = @"Hello\n"; // Hello\n

Utiliser la codification de caractres Unicode


Le caractre A est reprsent par U+0041

Comment crer et dclarer des Constantes


Dclare en utilisant le mot cl const et un type Sa valeur est affecte au moment de la dclaration

const int earthRadius = 6378;//km

const long meanDistanceToSun = 149600000;//km


const double meanOrbitalVelocity = 29.79D;//km sec

Comment faire des conversions entre types

Implicite

Effectu par le compilateur sur des oprations qui ne tronquent pas linformation

int x = 123456; //int est un entier de 4 bytes long y = x; //conversion implicite un long

Explicite

O on demande explicitement au compilateur deffectuer une conversion qui peut perdre de linformation

int x = 65537; short z = (short) x; // conversion explicit un short, z == 1

Quest ce que les Expressions et les Oprateurs?

Les oprateurs sont des Symboles utiliss dans les Expressions

Oprateurs communs

Exemple

Incrmenter/dcrmenter ++ --

Arithmtique
Relationnel Egalit Conditionnel Affectation

* / % + < > <= >= == != && || ?: = *= /= %= += -= <<= >>= &= ^= |=

Comment dterminer lordre de priorit des oprateurs ?

Les expressions sont values selon lordre de priorit des oprateurs 10 + 20 / 5 le rsultat est 14

Les parenthses peuvent tre utilises pour contrler lordre dvaluation (10 + 20) / 5 10 + (20 / 5) le rsultat est 6 le rsultat est 14

lordre de priorit des oprateurs est aussi dtermin par associativit

Les oprateurs binaires sont associatifs gauche


Laffectation et les oprateurs conditionnels sont are associatifs droite

Chapitre 3: Ecrire des mthodes

Dclarer dune mthode


La syntaxe dune mthode avec Microsoft Visual C# est :

returnType methodName ( parameterList ) {


// le corps de la mthode } Exemple int addValues(int leftHandSide, int rightHandSide) { // ... return leftHandSide + rightHandSide; } void showResult(int answer) { // ... le corps de la mthode }

Appeler une mthode


Une mthode est appele par son suivi dune liste dargument.

result = addValues(39, 3); // droite dune affectation showResult(addValues(39, 3)); // comme argument pour appeler une autre mthode. addValues; addValues(); addValues(39); addValues("39", "3"); // pas de parenthses // pas assez darguments // pas assez darguments // types errons

Il faut respecter le type et lordre des arguments

Dfinir la porte locale


class Example { void firstMethod() { int myVar; ... } void anotherMethod() { myVar = 42; // error variable not in scope ... } }

Dfinir la porte dans une classe


class Example { void firstMethod() { myVar = 45; ... } void anotherMethod() { myVar = 42; ... } int myVar = 0; }

Surcharger une mthode (Overload)

Surcharger une mthode permet de crer plusieurs mthodes dans une classe qui ont le mme nom mais avec des signatures diffrentes static void Main() { Console.WriteLine("The answer is "); Console.WriteLine(42); }

Chapitre 4 : les instructions conditionnelles

Dclarer une variable boolenne


bool areYouReady; areYouReady = true; Console.WriteLine(areYouReady); // Affichera True .

Les oprateurs dgalit

Oprateurs Signification

Exemple

Rsultat si age = 42

==
!=

gale
diffrent

age == 100 false


age != 100 true

Les oprateurs relationnels

Oprateurs

Signification

Exemple

Rsultat si age = 42

< <= > >=

infrieur inf ou gal suprieur sup ou gal

age < 21 age <= 16 age > 18 age >= 30

false true true false

Les oprateurs conditionnels

Oprateurs Signification

Exemple
(percent >= 0) && (percent <= 100); (percent >= 0) || (percent <= 100);

&&
||

et
ou

Comment et quand utiliser linstruction if

if

if ( sales > 10000 ) { bonus += .05 * sales; }

if else

if else if

if ( sales > 10000 ) { bonus += .05 * sales; } else if ( sales > 5000 ) { bonus = .01 * sales; } else { bonus = 0; if ( priorBonus == 0 ) { //ScheduleMeeting; } }

if ( sales > 10000 ) { bonus += .05 * sales; } else { bonus = 0; }

Comment utiliser linstruction switch


switch (day) { case 0 : case 1 : case 2 : ... default : }

dayName = "Sunday"; break; dayName = "Monday"; break; dayName = "Tuesday"; break; dayName = "Unknown"; break;

Quand utiliser linstruction switch

Vous ne pouvez utiliser que des donnes de types primitifs, comme int ou string. Les tiquettes doivent tre des constantes, comme 42 ou 42. Les tiquettes doivent tre uniques.

Lorsque deux tiquettes impliquent le mme comportement, il est possible de les regrouper. Case 1: Case 2: x = 20; break;

Chapitre 5 : les instructions itratives

Overview

Comment utiliser une boucle for Comment utiliser une boucle while Comment utiliser une boucle do Suivre par tapes lexcution dune instruction itrative pour voir le changement de valeur des variables

Utiliser les oprateurs daffectation composs

Ne pas crire

crire

variable = variable * number; variable = variable / number; variable = variable % number; variable = variable + number; variable = variable - number;

variable *= variable; variable /= variable; variable %= variable;

variable += variable;
variable -= variable;

Comment utiliser une boucle while

Un test est effectu au dbut de la boucle, si le test est False, la boucle nest jamais excute

La boucle sexcute jusqu ce que la condition devienne fausse

bool readingFile; // . . . while ( readingFile == true ) { GetNextLine(); }

continue, break

Comment utiliser une boucle for

Lutiliser lorsque le nombre ditrations excuter est connu


for (initialiseur; condition; itration {
instructions; } Exemple for (int i = 0; i < 10; i++) { Console.WriteLine("i = {0}",i); } for ( int j = 100; j > 0; j -= 10 ) { Console.WriteLine("j = {0}", j); }

Comment utiliser une boucle for (suite)


Exemples

for (int i = 0; ;i++) { Console.WriteLine("somebody stop me!"); } int i = 0; for (; i != 10; ) { Console.WriteLine(i); }

i++;

for (int i = 0, j = 10; i <= j; i++, j--) { ... } //multiple initialisations //multiple mises jour //une seule expression boolenne

La porte dune instruction for


Exemples

for (int i = 0; i != 10; i++) { ... } Console.WriteLine(i); // erreur de compilation for (int i = 0; i != 10; i++) { ... } for (int i = 0; i != 20; i += 2) { ... } // OK

Comment utiliser une boucle do

Excuter la boucle puis effectuer le test. Si le rsultat est True, la boucle se rpte jusqu ce que lexpression devienne False.
do { // instructions qui sexcuteront au moins // une fois } while (test est true); Exemple

int i = 1; do { Console.WriteLine ("{0}", i++); } while (i <= 10);

Chapitre 6: Grer les erreurs et les exceptions

Comment grer les Exception

La syntaxe pour grer les exceptions


try { // code suspect } catch { // grer les exceptions } finally { // toujours excuter }

Comment grer les Exception


Exemple

try { int leftHandSide = Int32.Parse(leftHandSideOperand.Text); int rightHandSide = Int32.Parse(rightHandSideOperand.Text); int answer = doCalculation(leftHandSide, rightHandSide); result.Text = answer.ToString(); } catch (FormatException fEx) { // grer lexception ... }

Utiliser plusieurs catch


Exemple

try { int leftHandSide = Int32.Parse(leftHandSideOperand.Text); int rightHandSide = Int32.Parse(rightHandSideOperand.Text); int answer = doCalculation(leftHandSide, rightHandSide); result.Text = answer.ToString(); } catch (FormatException fEx) { //... } catch (OverflowException oEx) { //... }

La premire exception qui correspond au problme est excute : lordre des catch est important

Utiliser plusieurs exceptions

Les exceptions sont regroupes en familles et relies de faon hirarchique par la relation dhritage

try { int leftHandSide = Int32.Parse(leftHandSideOperand.Text); int rightHandSide = Int32.Parse(rightHandSideOperand.Text); int answer = doCalculation(leftHandSide, rightHandSide); result.Text = answer.ToString(); } catch (Exception ex) { //... } // ceci est une exception gnrale

Grer les dbordements de capacit pour les int

Int32.MinValue et Int32.MaxValue permettent de connatre les bornes dun int. C# ne gnre pas dexceptions en cas de dbordement de capacit dun int (valeur errone).

Utiliser Checked et Unchecked pour les int

Il est possible dactiver ou de dsactiver overflow checking dans Visual Studio 2005.

Dans le menu Project, cliquer sur LeProjet Properties. Dans la dialog box project properties, cliquer sur longlet Build.

Cliquer sur le bouton Advanced.


Dans la dialog box Advanced Build Settings, cocher ou dcocher Check for arithmetic overflow/underflow.

Utiliser Checked et Unchecked pour les int

Il est possible de vrifier le dbordement dun int int number = Int32.MaxValue; checked { int willThrow = number++; Console.WriteLine("this won't be reached"); } int number = Int32.MaxValue; checked { int willThrow = number++; Console.WriteLine("this won't be reached"); }

Ecrire des expressions checked


int wontThrow = unchecked(Int32.MaxValue + 1); int willThrow = checked(Int32.MaxValue + 1);

Dclencher des Exceptions


Utiliser le mot cl Throw Types dException

Les classes d exceptions prdfinies dans le common language runtime Exemple: ArithmeticException, FileNotFoundException Les exceptions dfinies par lutilisateur

Dclencher des Exceptions


Exemple public static string monthName(int month) { switch (month) { case 1 : return "January"; case 2 : return "February"; ... case 12 : return "December"; default : throw new ArgumentOutOfRangeException("Bad month"); } }

Utiliser le bloc finally

TextReader reader = null; try { reader = src.OpenText(); string line; while ((line = reader.ReadLine()) != null) source.Text += line + "\n"; } } finally { if (reader != null) { reader.Close(); } }

Part II : Comprendre le langage C#

Chapitre 7 : Crer des classes et des objets

Que sont les classes et les objets?

Classe: est comme un ngatif pour des objets Contient des attributs et des mthodes

Classe
Covered Porch kitchen Dining Room Bath Office

Living Room

Family Room

Objets: instances dune classe

Crs en utilisant le mot cl new Impliquent des actions

Objet

Comment dfinir une classe et crer des objets

Comment dfinir une classe

public class Customer { public string name; public decimal creditLimit; public uint customerID; }

Comment instancier une classe : un objet

Customer nextCustomer = new Customer();

Comment accder un attribut de la classe

nextCustomer.name = "Suzan Fine";

Le commentaire XML du code

Trois slashes (///) avant la dclaration dune mthode, insrent des commentaires XML

Mettre un point juste aprs le nom dun objet affiche un pop-up menu pour accder aux membres de la classe de lobjet.

Dfinir laccessibilit et la porte

Les modificateurs daccs sont utiliss pour dfinir le niveau daccessibilit aux membres dune classe
Dclaration Dfinition
Accs illimit. Accs limit aux mthodes de la classe. Accs limit au programme. Accs limit aux mthodes de la classe et de ses classes drives Accs limit aux mthodes de la classe, des classes drives ou des membres du pgme

public private internal protected

protected internal

Conventions

Les identificateurs qui sont public commencent par une majuscule. Cest la PascalCase notation
Les identificateurs qui ne sont pas public commencent par une minuscule. Cest la camelCase notation. La seule exception cette rgle : une classe peut commencer par une majuscule et ses constructeurs doivent avoir le mme nom que la classe. Dans ce cas, un constructeur qui est private doit commencer par une majuscule.

Initialiser un objet

Un constructeur dInstances est une mthode spciale qui implmente les actions requises pour initialiser un objet Il a le mme nom que la classe Le constructeur par dfaut ne prend pas de paramtres

public class Lion { public Lion() { Console.WriteLine("Constructing Lion"); } }

Readonly Utilise pour affecter une valeur une variable dans le constructeur

Surcharger un Constructeur

Crer plusieurs constructeurs qui ont le mme nom mais qui ont des signatures diffrentes

Spcifier un initialiseur avec this

public class Lion { private string name; private int age; public Lion() : this( "unknown", 0 ) { Console.WriteLine("Default: {0}", name); } public Lion( string theName, int theAge ) { name = theName; age = theAge; Console.WriteLine("Specified: {0}", name); } }

Les classes partielles

C# 2.0 permet de diviser le code source dune classe en plusieurs fichiers.

Il est possible dorganiser la dfinition dune grande classe en de petits morceaux plus faciles grer.

Utiliser le mot cl partial

Pourquoi utiliser les membres de classe Static ?


double d = m.Sqrt(42.24); class Math { public static double Sqrt(double d) { ... } ... }

class Circle { public Circle() { radius = 0.0; NumCircles++; }


... private double radius; public static int NumCircles = 0;

Utiliser les membres de classe Static

Membre Static

Appartient la classe Initialis avant la cration dune instance de la classe Partag par toutes les instances de la classe

Ne peut pas tre prfix par this

class Lion { public static string family = "felidae"; } ... // un objet Lion na pas t cr dans ce code Console.WriteLine( "Family: {0}", Lion.family );

Initialiser une Classe

Constructeur Static

Sera excut au plus une fois Est excut avant que le premier objet de cette classe ne soit cr Na pas de paramtres (constructeur par dfaut) Ne prend pas de modificateurs daccs Est utilis pour initialiser une classe

Les classes static


Une classe static ne contient que des membres static. Le but dune classe static est dtre une conteneur pour un ensemble de champs et de mthodes.

Chapitre 8 : Comprendre les valeurs et rfrences

Les value types et les reference types ?

Value Type

Reference Type

Contient directement des donnes Stock dans la pile Doit tre initialis Doit tre non null int est un value type

Contient une rfrence la donnes Stock dans la heap Dclar en utilisant new .NET garbage collector soccupe de la destruction class est un reference type

int i; i = 42;

CostObject c;

42

42

Copier des variables int et des objets

Passer des paramtres une mthode

Passage par valeur

class Lion { private int weight; public void SetWeight(int newWeight) { weight = newWeight; } } . . .
Lion bigLion = new Lion(); int bigLionWeight = 250; bigLion.SetWeight( bigLionWeight );

Passer des Paramtres par rfrence

Utiliser le mot cl ref

public void GetAddress(ref int number, ref string street) { number = this.number; street = this.street; } . . . int sNumber = 0; string streetName = null; zoo.GetAddress( ref sNumber, ref streetName ); // sNumber et streetName ont de nouvelles valeurs

Affectation dfinie: Les paramtres passes doivent tre dfinis. Utiliser le mot cl out Permet dinitialiser une variable dans une mthode

Comment la mmoire est organise


La mmoire est divise en deux parties: stack et heap. Les value types sont crs dans la stack. Les reference types (objects) sont crs dans le heap.

La classe System.Object

Toutes les classes hritent de la classe System.Object . Il est possible dutiliser System.Object pour crer une variable qui fait rfrence nimporte quel reference type . Utiliser object plutt que System.Object .

Boxing

Une variable de type object peut galement faire rfrence un value type .

Modifier la variable i ne modifie pas la variable o.

unboxing

int i = 42; object o = i;

i = (int)o;

Unboxing (suite)

Le type spcifi lors du unboxing cast doit exactement correspondre au type actuellement du box.

Chapitre 9: Crer des Value Types avec des Enumerations et des Structs

Crer et utiliser les types numrations

Dfinir un type numration

enum Season { Spring, Summer, Fall, Winter }

Utiliser un type numration

class Example { public void Method(Season parameter) { Season localVariable; ... } private Season currentSeason; }

Afficher des variables


enum Season { Spring, Summer, Fall, Winter}

Season colorful = Season.Fall; Console.WriteLine(colorful); // Affiche 'Fall' string name = colorful.ToString(); Console.WriteLine(name); // Affiche aussi 'Fall' Season colorful = Season.Fall; Console.WriteLine((int) colorful);

// Affiche 2

Utiliser les types numrations

Affecter des valeurs aux lments de lnumration

enum Season { Spring = 1, Summer, Fall, Winter }

enum Season { Spring, Summer, Fall, Autumn = Fall, Winter }

Affecter un type sous-jacent aux lments de lnumration

enum Season : short { Spring, Summer, Fall, Winter }

Le type Structure

Une structure peut avoir des propres champs, mthodes, et constructeurs comme une a classe, mais elle un value type et non un reference type Une structure est stocke dans le stack Les types int, long, et float, sont des alias pour les structures System.Int32, System.Int64, et System.Single Il nest pas possible de dclarer un constructeur par dfaut car le compilateur le gnre automatiquement si un autre constructeur na pas t dfini.

Le constructeur par dfaut initialisera les champs de la structure 0, false, ou null

Structure ou classe
Keyword bool byte decimal Double Float Int Long Object Sbyte Short String Uint Ulong Ushort Type equivalent System.Boolean System.Byte System.Decimal System.Double System.Single System.Int32 System.Int64 System.Object System.SByte System.Int16 System.String System.UInt32 System.UInt64 System.UInt16 Class or structure Structure Structure Structure Structure Structure Structure Structure Class Structure Structure Class Structure Structure Structure

Dfinir un type Structure

struct Time { public Time(int hh, int mm, int ss) hours = hh % 24; minutes = mm % 60; seconds = ss % 60; } public int Hours() { return hours; } ... private int hours, minutes, seconds; }

La diffrence entre structure et classe


struct Time { public Time() { ... } // erreur de compilation ... } struct Time { public Time(int hh, int mm){ hours = hh; minutes = mm; } // erreur de compilation : seconds pas initialise ... private int hours, minutes, seconds; } struct Time ... private private private } { int hours = 0; // int minutes; int seconds; erreur de compilation

Dclarer une variable Structure


struct Time { int hours, minutes, seconds; } class Example { public void Method(Time parameter) { Time localVariable; ... } private Time currentTime; }

Linitialisation dune structure

struct Time { public Time(int hh, int mm){ hours = hh; minutes = mm; seconds = 0; } ... private int hours, minutes, seconds; }

Copier une variable structure

Time now; Time copy = now; // compile time error: now unassigned

Chapitre 10: Utiliser Array et Collection

Quest ce quun Array?

Une structure de donnes qui contient un nombre de variables appeles array elements.

Tous les array elements doivent tre de mme type Un Array est zero indexed Un Array est un objet, cest donc un reference type Un Array peut tre : Single-dimensional Multidimensional Jagged, un array dont les lments sont des array

Dclarer et instantier un Array

Dclarer un array en ajoutant deux crochets aprs le type de ses lments


int[] MyIntegerArray;

Instantier un array

int[ ] numbers = new int[5]; object [ ] animals = new object [100];

Crer un array de type Object

Crer un array bi-dimensionnel

int[,] table = new int[4,6];

Dclarer et instantier un Array (suite)

Initialiser et Accder aux Array Members

Initialiser un array

int[] numbers = new int[10] {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};


int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};

Accder aux array members

string[] animal = {"Mouse", "Cat", "Lion"}; animal[1]= "Elephant"; string someAnimal = animal[2];

Parcourir les lments dun Array en utilisant foreach

Utiliser foreach permet de rpter les instructions pour chaque lment du array

int[] numbers = {4, 5, 6, 1, 2, 3, -2, -1, 0}; foreach (int i in numbers) { Console.WriteLine(i); }

ou

int[] numbers = {4, 5, 6, 1, 2, 3, -2, -1, 0}; for (int ndex = 0; index != numbers; index++) { int i = numbers[index]; Console.WriteLine(i); }

Quand ne pas utiliser foreach

foreach parcourt tous les lments du array, pour parcourir une partie seulement utiliser linstruction for. foreach parcourt le array de lindex 0 vers lindex Length 1. Pour le parcours inverse utiliser linstruction for.

Si le corps de la boucle a besoin de connatre lindex dun lment plutt que sa valeur, utiliser linstruction for.

Copier des variables array


int[] pins = { 9, 3, 7, 2 }; int[] alias = pins; // mme array instance int[] pins = { 9, 3, 7, 2 }; int[] copy = new int[pins.Length]; for (int i = 0; i != copy.Length; i++) { copy[i] = pins[i]; } // instances diffrentes int[] pins = { 9, 3, 7, 2 }; int[] copy = new int[pins.Length]; pins.CopyTo(copy, 0); int[] pins = { 9, 3, 7, 2 }; int[] copy = new int[pins.Length]; Array.Copy(pins, copy, copy.Length); int[] pins = { 9, 3, 7, 2 }; int[] copy = (int[])pins.Clone();

Les classes Collection


Lists, queues, stacks, et hash tables sont des faons pour organiser les donnes dans une application

List: Une collection qui permet dy accder avec un index Exemple: un array est une list; un ArrayList est une list Queue: First-in, first-out dobjets Exemple: attedre dans une file devant un guichet Stack: Une collection Last-in-first-out dobjets Exemple: Une pile dassiettes Hash table: Reprsente une collection de couples (key,value) organise autour du hash code de la key Exemple: Un dictionnaire

Count permet de connatre le nombre dlments dans la collection using System.Collections; doit figurer dans les using

La classe ArrayList

ArrayList na pas la taille fixe; elle peut grandir au besoin Utiliser Add pour ajouter un object la fin de la ArrayList Utiliser insert pour ajouter un object une position dans la ArrayList Utiliser remove pour supprimer un object de la ArrayList

Utiliser[] pour accder aux lments de la ArrayList


Utiliser Clear pour supprimer tous les lments

Exemple
ArrayList numbers = new ArrayList(); foreach (int number in new int[12]{10,9,8,7,7,6,5,10,4,3,2, 1}) { numbers.Add(number); } // Supprimer le 1er lment dont la valeur est 7 numbers.Remove(7); // Supprimer le 7me lment (10) numbers.RemoveAt(6); // Afficher les 10 lments restants avec for for (int i = 0; i != numbers.Count; i++) { int number = (int)numbers[i]; //besoin dun cast Console.WriteLine(number); } // Afficher les 10 lments restants avec foreach foreach (int number in numbers){ Console.WriteLine(number); //pas besoin dun cast }

Les classes Queue et Stack

Queues: first-in, first-out


Enqueue place les objets dans la queue Dequeue supprime les objets de la queue

Stacks: last-in, first-out

Push place les objets dans la stack


Pop supprime les objets de la stack

Exemple de la classe Queue


Queue numbers = new Queue();
// Remplir la queue

foreach (int nbr in new int[4]{9, 3, 7, 2}) { numbers.Enqueue(nbr); Console.WriteLine(nbr + " a rejoint la queue " ); }
// Afficher les lments de la queue

foreach (int number in numbers) { Console.WriteLine(number); }


// Vider la queue

while (numbers.Count != 0) { int number = (int)numbers.Dequeue(); Console.WriteLine(number + " a quitt la queue"); }

Exemple de la classe Stack


Stack numbers = new Stack();
// Remplir la stack

foreach (int number in new int[4]{9, 3, 7, 2}) { numbers.Push(number); Console.WriteLine(number + " has been pushed on the stack"); }
// Afficher les lments de la stack

foreach (int number in numbers) { Console.WriteLine(number); }


//Vider la stack

while (numbers.Count != 0) { int number = (int)numbers.Pop(); Console.WriteLine(number + "has been popped off the stack"); }

La classe HashTable

Une hashtable est une structure de donnes qui associe une cl avec un object, pour une recherche rapide
Une SortedList est une hashtable dont les cls sont tries
Key Object

Book techBook = new Book("Inside C#", 0735612889); // ... public Hashtable bookList; // bookList.Add(0735612889, techBook); // Book b = (Book) bookList[0735612889]; // le titre de b est "Inside C#"

Exemple de la classe Hashtable

Hashtable ages = new Hashtable();


// Remplir la Hashtable

ages["John"] = 41; ages["Diana"] = 42; ages["James"] = 13; ages["Francesca"] = 11;


// Parcourir la Hashtable

foreach (DictionaryEntry element in ages) { string name = (string)element.Key; int age = (int)element.Value; Console.WriteLine("Name: {0}, Age: {1}", name, age); }

Exemple de la classe SortedList

SortedList

ages = new

SortedList ();

// Remplir la SortedList

ages["John"] = 41; ages["Diana"] = 42; ages["James"] = 13; ages["Francesca"] = 11;


// Parcourir la SortedList

foreach (DictionaryEntry element in ages) { string name = (string)element.Key; int age = (int)element.Value; Console.WriteLine("Name: {0}, Age: {1}", name, age); }

Chapitre 11 : Parameter Arrays

Utiliser un Array comme paramtres dune Mthode


class Util { public static int Min(int[] paramList) { if (paramList == null || paramList.Length == 0) { throw new ArgumentException("Util.Min"); } int currentMin = paramList [0]; foreach (int i in paramList) { if (i < currentMin) { currentMin = i; ... int[] array = new int[3]; } array[0] = first; } array[1] = second; return currentMin; array[2] = third; } ... } int min = Util.Min(array);

Dclarer un params Array


class Util { public static int Min(params int[] paramList) { if (paramList == null || paramList.Length == 0) { throw new ArgumentException("Util.Min"); } int currentMin = paramList [0]; foreach (int i in paramList) { if (i < currentMin) { currentMin = i; } } return currentMin; } } ... int min = Util.Min(first, second, third);

A ne pas faire

params ne peut tre utilise que pour des arrays dune dimension.
public static int Min(params int[,] table)

Une mthode ne peut tre surcharge sur la base de params seulement.


public static int Min(int[] paramList) public static int Min(params int[] paramList)

Il est interdit dutiliser ref ou out pour des params arrays.


public static int Min(ref params int[] paramList) public static int Min(out params int[] paramList)

Un params array doit tre le dernier paramtre.


public static int Min(params int[] paramList, int i)

Le compilateur dtecte et rejette les surcharges potentiellement ambigus.

public static int Min(params int[] paramList) public static int Min(int, params int[] paramList)

Une mthode non-params est toujours plus prioritaire sur une mthode params : Lorsque Min est appele avec 2 paramtres, cest la 1re qui est excute
public static int Min(int leftHandSide, int rightHandSide) public static int Min(params int[] paramList)

Utiliser params object[ ]


class Black { public static void Hole(params object [] paramList) ... } // nombre et type darguments diffrents

Il est possible dappeler la mthode sans paramtres.


Black.Hole(); // converti en Black.Hole(new object[0]);

Il est possible dappeler la mthode avec null.


Black.Hole(null);

Il est possible dappeler la mthode avec un array dj initialis.


object[] array = new object[2]; array[0] = "forty two"; array[1] = 42; Black.Hole(array);

Il est possible dappeler la mthode avec des arguments de types diffrents.


Black.Hole("forty two", 42); //converti en Black.Hole(new object[]{"forty two", 42});

Chapitre 12 : Lhritage

Les bnfices de la programmation oriente Objet


Tendances du Structured Design Tendances du Object-Oriented Object-Centered

1 2

Process-Centered

Reveals Data

Hides Data

3
4 5

Single Unit

Modular Units

One-Time Use

Reusable

Ordered Algorithm

Nonordered Algorithm

Encapsulation

Grouper des donnes et des processus dans un conteneur

Rendre le fonctionnement des choses sans changer leur interaction avec lutilisateur Rendre lobjet plus facile utiliser

Cacher les dtails internes

Lhritage

Lhritage spcifie une relation est une sorte de / is a kind of Les classes drives hritent les proprits et les mthode de la classe de base, permettant ainsi la rutilisation du code Les classes drives deviennent plus spcialises

Classe de base
Animal

Elephant

Cat

Classes drives

Crer une classe drive


public class Animal { public void Sleep() { } public void Eat() { } } public class Lion : Animal { public void StalkPrey() { } } ... Lion adoptedLion = new Lion(); adoptedLion.StalkPrey(); adoptedLion.Eat();

Appeler le constructeur de base partir de la classe drive

Le mot cl base est utilis par classe drive pour appeler le non-default constructor de la classe de base

public class Animal { public Animal(GenderType gender) { // . . . Console.WriteLine("Constructing Animal"); } } public class Elephant : Animal { public Elephant(GenderType gender): base(gender) { //Elephant code Console.WriteLine("Constructing Elephant"); } }

Affecter des variables


class Token { ... } class IdentifierToken : Token { ... }

class KeywordToken : Token { ... } ... IdentifierToken it = new IdentifierToken(); KeywordToken kt = it; // erreur types diffrents
IdentierToken it = new IdentifierToken(); Token t = it; // lgal

Les mthodes new

Le mot cl new permet de supprimer le warning seulement

class Token { ... public string Name() { ... } } class IdentifierToken : Token { ... new public string Name() { ... } }

Polymorphisme
Objets Animal Elephant Mthode Appele Comportement Mange lherbe

Eat ()

Cat

Eat ()

Mange la souris

Mouse

Eat ()

Mange le fromage

Les mthodes Virtual


public class Animal { public virtual void Eat() { Console.WriteLine("Eat something"); } } public class Cat : Animal { public override void Eat() { Console.WriteLine("Eat small animals"); } }

Les mthodes Virtual (suite)

Les mthodes Virtual sont utilises pour dfinir les mthodes des classes de bases qui peuvent tre redfinies dans les classes drives
Classe de Base Animal Mthode Virtual Eat () Rsultat Eat Something Classe drive Cat Mthode Override Eat () Rsultat Eat Mouse

Exemple
class Mammal { public virtual string GetTypeName() { return "This is a mammal"; } } class Horse : Mammal { public override string GetTypeName() { return "This is a horse"; Mammal m; } Horse h = new Horse(); } Whale w = new Whale(); Kangaroo k = new Kangaroo(); class Whale : Mammal { m = h; public override string GetTypeName () Console.WriteLine(m.GetTypeName()); { m = w; return "This is a whale"; Console.WriteLine(m.GetTypeName()); } m = k; } Console.WriteLine(m.GetTypeName());

class Kangaroo : Mammal { ... }

Comment utiliser les membres de la classe de base par la classe drive

Le mot cl base est utilis pour appeler une mthode dans la classe de base partir de la classe drive
{

public class Cat : Animal base.Eat();

public override void Eat() {


Console.WriteLine("Eat small animals"); } }

Quelques rgles pour les mthodes virtual

Il est pas possible de dclarer virtual ou override une mthode private.

Les deux mthodes doivent tre identiques (mme signature).


Les deux mthodes doivent avoir le mme accs (public, public par exemple).

On ne peut override quune mthode virtual.


Si la classe drive nest pas override, elle ne redfinie pas la mthode de la classe de base.

Une mthode override est implicitement virtual et donc peut tre overridden. Il nest pas permis de dclarer virtual une mthode override.

Laccs protected

Une classe drive peut accder aux membres dclars protected dans la classe de base.

Si une classe nest pas une classe drive, elle ne peut pas accder aux membres dclars protected dans la classe de base.

Quest ce quune Interface?


Une interface:

Un reference type qui dfini un contrat Spcifie les membres qui doivent tre fournis par les classes ou interfaces qui implmentent linterface Peut contenir des mthodes, des proprits, des indexers et des vnements Ses membres ne sont pas implments Peut hriter de zro ou plusieurs interfaces

Les restrictions sur les interfaces


Une interface:

Ne contient pas de champs, mme static. Ne contient pas de constructeurs. Ne contient pas de destructeurs.

Ne contient pas des access modifiers. Toutes les mthodes sont implicitement public.
Ne contient pas les enums, structs, classes, interfaces, or delegates.

Ne peut tre hrite partir dune classe ou dune structure.

Utiliser une interface

Une interface dfinit la mme fonctionnalit et le mme comportement de classes sans relations entre elles. Une interface permet de sparer compltement le nom dune mthode de son implmentation. Dclarer une interface

Implmenter une interface

interface ICarnivore { bool IsHungry { get; } Animal Hunt(); void Eat(Animal victim); }

Travailler avec des objets qui implmentent des interfaces

is

if ( anAnimal is ICarnivore ) { ICarnivore meatEater = (ICarnivore) anAnimal; Animal prey = meatEater.Hunt(); meatEater.Eat( prey ); }

as

ICarnivore meatEater = anAnimal as ICarnivore; if ( meatEater != null ) { Animal prey = meatEater.Hunt(); meatEater.Eat( prey ); }

// is et as avec un objet if ( prey is Antelope ) { ... }

Rfrencer une classe travers son interface


IdentifierToken it = new IdentifierToken(); IToken iTok = it; // lgal

void Process(Itoken iTok) { ... }

Lhritage Multiple des Interfaces


class Chimpanzee: Animal, ICarnivore, IHerbivore { }

Les interfaces peuvent dcrire un type de comportement Exemples:

Lion is-a-kind-of Animal; il a le comportement dun Carnivore


Shark is-a-kind-of Animal; il a le comportement dun Carnivore

Lion et Shark drivent de la clase Animal


Elles implmentent le comportement Carnivore dans une Interface

Les Interfaces et le .NET Framework

Permettent vos objets de se comporter comme les objets du .NET Framework

Exemple: Interfaces utilises par les classes Collection

ICollection, IComparer, IDictionary, IDictionary Enumerator, IEnumerable, IEnumerator, IHashCodeProvider, IList

public class Zoo : IEnumerable { . . . public IEnumerator GetEnumerator() { return (IEnumerator)new ZooEnumerator( this ); }

Les classes et les mthodes abstract

Une classe abstract class est une classe de base gnrique

Contient une mthode abstract qui doit tre implmente par une classe drive

Une mthode abstract nest pas imlmente dans la classe de base

public abstract class Animal { public abstract void Eat(); public abstract Group PhylogenicGroup { get; } }

Elle peut contenir des membres non-abstract


Elle ne peut tre instancie

Les classes et les mthodes Sealed

Les classes abstract

Il est impossible de crer une classe drive partir dune classe sealed Une classe sealed ne contient pas de mthodes virtual

public sealed class MyClass { // class members }

Les mthodes sealed

Une mthode sealed ne peut tre overidden dans la classe drive. Une mthode doit tre override pour lui attribuer le qualificatif sealed : la mthode sera dclare sealed override.

interface, virtual, override, et sealed

Une interface introduit le nom dune mthode. Une mthode virtual est la premire implmentation dune mthode. Une mthode override est une autre implmentation dune mthode. Une mthode sealed est la dernire implmentation dune mthode.

Rsum
Mot cl Abstract New override private Interface no yes* no no
Classe Abstract

Classe no yes yes yes

Classe sealed

struct no no no yes

yes yes yes yes

no yes yes yes

protected
public sealed virtual

no
no no no

yes
yes yes yes

yes
yes yes yes

yes
yes yes no

no**
yes no no

*Une interface peut tendre une autre interface et introduire une nouvelle mthode avec la mme signature.

Une struct derive implicitement de System.Object, qui contient des mthodes que la struct peut cacher.
Une struct drive implicitement de System.Object, qui ne contient pas de mthodes virtual. **Une struct est implicitement sealed.

Chapitre 13: Garbage Collection et Resource Management

Ecrire un destructeur
class Tally { public Tally() { this.instanceCount++; } ~Tally() { this.instanceCount--; } public static int InstanceCount() { return this.instanceCount; } ... private static int instanceCount = 0; }

Les restrictions sur les destructeurs

Il nest pas possible de dclarer un destructeur dans une struct. struct Tally
{ }

~Tally() { ... } // compile-time error

Il nest pas possible de dclarer un modificateur daccs. Cest le garbage collector qui lappelle et non lutilisateur. public ~Tally() { ... } Jamais dclarer un destructeur avec des paramtres.
~Tally(int parameter) { ... }

Le compilateur traduit automatiquement un destructeur en un override de la mthode Object.Finalize.

Pourquoi Utiliser le Garbage Collector ?


Un utilisateur peut oublier de dtruire un objet. Un utilisateur peut essayer de dtruire un objet actif. Un utilisateur peut essayer de dtruire un objet plus dune fois. Le garbage collector est responsable de dtruire les objets, il garantie:

Chaque objet sera dtruit et son destructeur excut.


Chaque objet est dtruit une seule fois. Chaque objet est dtruit seulement lorsquil devient inutile; il nexiste aucune rfrence cet objet.

Resource Management

Certaines ressources sont si prcieuse quil est ncessaire de les librer le plutt possible. Ces classes possdent des mthodes disposal pour les librer.

TextReader reader = new StreamReader(filename); string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } reader.Close();

Resource Management (suite)

Pour tre sr quune ressource est librs

TextReader reader = new StreamReader(filename); try { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } finally { reader.Close(); }

Encore mieux

using fournit un mcanisme propre pour contrler le temps de vie dun objet. Lobjet cr sera dtruit la fin du bloc dinstruction using. Lobjet doit implmenter linterface IDisposable

using (TextReader reader = new StreamReader(filename)) { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } }

Appeler la mthode Dispose partir dun destructeur


class Example : IDisposable { ... ~Example() { Dispose(); } public virtual void Dispose() { if (!this.disposed) { try { // librer les ressources prcieuses } finally { this.disposed = true; GC.SuppressFinalize(this); } } } public void SomeBehavior() // mthode exemple { checkIfDisposed(); ... } ... private void checkIfDisposed() { if (this.disposed) { throw new ObjectDisposedException("Example"); } } } private Resource scarce; private bool disposed = false;

Part III : Crer des composants

Chapitre 14 : Implmenter des Proprits pour accder aux attributs

Que sont les proprits ?

Les proprits sont des mthodes qui protgent laccs aux membres dune classe
private int animalWeight; public int Weight { get { return animalWeight; } set { animalWeight = value; } }

Dclarer des proprits


struct ScreenPosition { public ScreenPosition(int X, int Y) { this.x = rangeCheckedX(X); this.y = rangeCheckedY(Y); } public int X { get { return this.x; } set { this.x = rangeCheckedX(value); } }

public int Y { get { return this.y; } set { this.y = rangeCheckedY(value); } }


private static int rangeCheckedX(int x) { ... } private static int rangeCheckedY(int y) { ... } private int x, y;

Utiliser des proprits


ScreenPosition origin = new ScreenPosition(0, 0); int xpos = origin.X; int ypos = origin.Y; ... origin.X = 40; origin.Y = 100; ... origin.X += 10;

Les proprits Read-Only


struct ScreenPosition { ... public int X { get { return this.x; } } } origin.X = 140; // compile-time error

Les proprits Write-Only

struct ScreenPosition { ... public int X { set { this.x = rangeCheckedX(value); } } }


Console.WriteLine(origin.X); // compile-time error origin.X = 200; // ok origin.X += 10; // compile-time error

Laccessibilit des proprits


struct ScreenPosition { ... public int X { get { return this.x; } private set { this.x = rangeCheckedX(value); } } public int Y { get { return this.y; } private set { this.y = rangeCheckedY(value); } } ... private int x, y;

Il est possible de changer laccessibilit de get ou set et non des deux. set et get ne doivent pas avoir une accessibilit moins restrictive que la proprit .

Exemple: la proprit est private et set ou get est public

Les restrictions sur les proprits

Il est interdit dinitialiser une proprit dans une struct ou une classe en utilisant set (sans new)
ScreenPosition location; location.X = 40; //erreur

Il est interdit dutiliser une proprit comme un argument ref ou out argument.
MyMethod(ref location.X); // erreur

Une proprit ne peut contenir quun set au plus et un get au plus. get et set ne prennent pas darguments. Il est interdit de dclarer une proprit const ou readonly.
const int X { get { ... } set { ... } } // erreur

Dclarer des proprits dans des interfaces


interface IScreenPosition { int X { get; set; } int Y { get; set; } } struct ScreenPosition : IScreenPosition { class ScreenPosition:IScreenPosition ... { public int X struct ScreenPosition ... { public virtual int X : IScreenPosition get { ... } { set { ... } { ... } get { ... } int IScreenPosition.X set { ... } { public int Y } { get { ... } get { ... } set { ... } public virtual int Y set { ... } } { } get { ... } ... int IScreenPosition.Y set { ... } } { } get { ... } ... set { ... } } } ... private int x, y; }

Chapitre 15 : Utiliser les Indexers

Que sont les indexers ?

Un indexer permet de voir un int comme un tableau de bits et daccder aux bits de lint

struct IntBits { public IntBits(int initialBitValue) { bits = initialBitValue; } public bool this [ int index ] { get { return (bits & (1 << index)) != 0; } set { } if (value) bits |= (1 << index); else bits &= ~(1 << index);

} private int bits;

Utiliser les indexers


Un indexer nest pas une mthode. Un indexer prend toujours un seul argument qui spcifie quel lment est accd. Tous les indexers utilisent le mot cl this la place du nom de la mthode. Une classe ou une struct ne peut dfinir quun seul indexer, il est toujours appel this.
int adapted = 63; IntBits bits = new IntBits(adapted); bool peek = bits[6]; bits[0] = true; bits[31] = false;

Comparer les array et les indexers

Les indexers peuvcent utiliser des subscripts nonnumeric, alors que les arrays utilisent seulement des subscripts entiers. Les indexers peuvent tre overloaded, alors que les arrays ne le peuvent pas. Les indexers ne peuvent tre utiliss comme des paramtres ref ou out, alors que les arrays le peuvent .

public int this [ string name ] { ... } // ok

public Name this [ PhoneNumber number ] { ... } public PhoneNumber this [ Name name ] { ... }

IntBits bits; // bits contient un indexer Method(ref bits[1]);

Proprits, Arrays, et Indexers


struct Wrapper { int[] data; ... public int this [int i] { get { return this.data[i]; } set { this.data[i] = value; } } }

Wrapper wrap = new Wrapper(); ... int[] myData = new int[2]; myData[0] = wrap[0]; myData[1] = wrap[1]; myData[0]++; myData[1]++;

Dclarer des indexers dans des interfaces


interface IRawInt { bool this [ int index ] { get; set; } } struct RawInt { ... public bool { get { ... set { ... } ... } : IRawInt this [ int index ] } class RawInt : IRawInt } { ... public virtual bool this [ int index ] { get { ... } struct RawInt : IRawInt set { ... } { ... } bool IRawInt.this [int index] ... { } get { ... } set { ... } } ... }

Chapitre 16 : les Delegates et les Events

Crer un Delegate
Gardien de Zoo 1 Soigne un lion CheckGriffes Centre Mdical Grer les rendez-vous Gardien de Zoo 2 Soigne un antilope CheckSabots

Appeler ProcessNextPatient Delegate TypeRendez-vous

Lion CheckGriffes

Antilope CheckSabots

Utiliser les delegate


class Controller { delegate void stopMachineryDelegate(); public stopMachineryDelegate StopMachinery { get { return this.stopMachinery; } set { } this.stopMachinery = value;

public void Add(stopMachineryDelegate stopMethod) { this.stopMachinery += stopMethod; } public void Remove(stopMachineryDelegate stopMethod) { this.stopMachinery -= stopMethod; } public void ShutDown() { this.stopMachinery(); } private stopMachineryDelegate stopMachinery;

Utiliser les delegates (suite)

Controller control = new Controller(); FoldingMachine folder = new FoldingMachine(); WeldingMachine welder = new WeldingMachine(); PaintingMachine painter = new PaintingMachine(); ... control.Add(folder.StopFolding); control.Add(welder.FinishWelding); control.Add(painter.PaintOff); ... control.ShutDown();

Crer un adaptateur de mthodes (Method Adapter)


delegate void stopMachineryDelegate(); ... this.stopMachinery += folder.StopFolding;

void StopFolding(int shutDownTime); ... void FinishFolding() { folder.StopFolding(0); } ... this.stopMachinery += FinishFolding;

Utiliser les mthodes anonymes comme adaptateurs

Une mthode anonyme est une mthode qui na pas de nom

this.stopMachinery += delegate { folder.StopFolding(0); };

et
control.Add(delegate { folder.StopFolding(0); } );

Caractristiques des mthodes anonymes

Les paramtres sont spcifis entre parenthses juste aprs le mot cl delegate.

control.Add(delegate(int param1, string param2) { /* le code qui utilise param1 et param2 */ });

Une mthode Anonymous peut retourner des valeurs, mais le type de retour doit correspondre celui du delegate auquel elle est ajoute. Le code dune mthode anonymous est du code C# ordinaire. Il peut contenir des instructions, des appels des mthodes, des dfinitions de variables, etc.

Quest ce un Event?

La Souris et le clavier
MouseDown, MouseUp, MouseMove, MouseEnter, MouseLeave, MouseHover

KeyPress, KeyDown, KeyUp

Proprit

FontChanged SizeChanged CursorChanged

Dclarer un Event

class TemperatureMonitor {

public delegate void StopMachineryDelegate();


public event StopMachineryDelegate MachineOverheating; ... }

Souscrire un Event
TemperatureMonitor tempMonitor = new TemperatureMonitor();

...
tempMonitor.MachineOverheating += delegate { folder.StopFolding(0) }; tempMonitor.MachineOverheating += welder.FinishWelding;

tempMonitor.MachineOverheating += painter.PaintOff;

De mme, pour supprimer une mthode dun vnement, utiliser loprateur -=

Dclencher un Event
class TemperatureMonitor { public delegate void StopMachinerDelegate; public event StopMachineryDelegate MachineOverheating; ... private void Notify() { if (this.MachineOverheating != null) { this.MachineOverheating(); } } ... }

Ecrire un Event Handler


namespace System { public delegate void EventHandler(object sender, EventArgs args) ; public class EventArgs { ... } class Example : System.Windows.Forms.Form { private System.Windows.Forms.Button okay; ... public Example() { this.okay = new System.Windows.Forms.Button(); this.okay.Click += new System.EventHandler(this.okay_Click); } ...

namespace System.Windows.Forms { public class Control : { public event EventHandler Click; ... } public class Button : Control { ... } }

private void okay_Click(object sender, System.EventsArgs args) { ... }

Chapitre 17 : introduire les Generics

Le problme avec les objets


public void Enqueue( object item ); public object Dequeue(); using System.Collections; ... Queue myQueue = new Queue(); Circle myCircle = new Circle(); myQueue.Enqueue(myCircle); ... myCircle = (Circle)myQueue.Dequeue(); Queue myQueue = new Queue(); Circle myCircle = new Circle(); myQueue.Enqueue(myCircle); ... Clock myClock = (Clock)myQueue.Dequeue();//erreur

lexcution

Queue myQueue = new Queue(); int myInt = 99; myQueue.Enqueue(myInt); // box de int un object(+ despace mem) ... myInt = (int)myQueue.Dequeue(); // unbox de lobject un int

Les generics : la solution


public class Queue<T> : ...
... public void Enqueue( T item ); public T Dequeue();

Donc
using System.Collections.Generic; ... Queue<Circle> myQueue = new Queue<Circle>(); Circle myCircle = new Circle(); myQueue.Enqueue(myCircle); ... myCircle = myQueue.Dequeue();

Utiliser les generics


struct Person { ... } ... Queue<int> intQueue = new Queue<int>(); Queue<Person> personQueue = new Queue<Person>(); Queue<Queue<int>> queueQueue = new Queue<Queue<int>>();

Il est possible pour une classe generic davoir multiple types de paramtres
struct Person { ... } ... Dictionary<string, Person> directory = new Dictionary<string, Person>(); Person john = new Person(); directory["John"] = john; ... john = directory["John"];

Les generics et les contraintes

Il est possible dajouter des contraintes sur les lments pour une classe generic

public class PrintableCollection<T> where T : IPrintable

Les contraintes
Contrainte
where T: struct where T : class where T : new()

Description
Le type argument doit tre une value type. Le type argument doit tre un reference type : class, interface, delegate, ou array type. Le type argument doit avoir un constructeur public sans paramtres. Lorsque elle est utilise en conjonction avec dautres contraintes, la contrainte new() doit tre spcifie en dernier. Le type argument doit tre ou driver de la classe de base spcifie. Le type argument doit tre ou implmenter l interface spcifie.

where T : <base class name>

where T : <interface name>

Les interfaces System.IComparable et System.IComparable<T>


class Circle : System.IComparable { ... public int CompareTo(object obj) { Circle circObj = (Circle)obj; if (this.Area() == circObj.Area()) return 0; if (this.Area() > circObj.Area()) return 1; class Circle : System.IComparable<Circle> { return -1; ... public int CompareTo(Circle other) { if (this.Area() == other.Area()) return 0;

if (this.Area() > other.Area()) return 1;


} return -1;

public bool Equals(Circle other) { return (this.CompareTo(other) == 0); }

Crer une classe generic

Algorithme de construction de larbre binaire

If the tree, T, is empty Then Construct a new tree T with the new item I as the node, and empty left and right sub-trees Else Examine the value of the node, N, of the tree, T If the value of N is greater than that of the new item, I Then If the left sub-tree of T is empty Then Construct a new left sub-tree of T with the item I as the node, and empty left and right sub-trees Else Insert I into the left sub-tree of T End If Else If the right sub-tree of T is empty Then Construct a new right sub-tree of T with the item I as the node, and empty left and right sub-trees Else Insert I into the right sub-tree of T End If End If End If

Schma de larbre binaire

Insrer des lments dans larbre

Crer une classe generic

Algorithme dimpression du contenu de larbre binaire


If the left sub-tree is not empty Then Display the contents of the left sub-tree End If Display the value of the node If the right sub-tree is not empty Then Display the contents of the right sub-tree End If

Imprimer les lments de larbre

Crer une mthode generic


static void Swap<T>( ref T first, ref T second) { T temp = first; first = second; second = temp; }

Exemple
int a = 1, b = 2; Swap<int>(ref a, ref b); ... string s1 = "Hello", s2 = "World"; Swap<string>(ref s1, ref s2);

Chapitre 18 : Enumrer les Collections

Enumrer des lments dans une collection


Utiliser foreach pour les collections numrables. Une collection enumerable est une collection qui implmente linterface System.Collections.IEnumerable. La classe System.Array est une collection qui implmente linterface IEnumerable. Linterface IEnumerable contient une seule mthode :
IEnumerator GetEnumerator();

Un objet enumerator implmente linterface System.Collections.IEnumerator.


object Current {get;} bool MoveNext(); void Reset();

IEnumerator<T> et IEnumerable<T>.

Implmenter un Enumerator en utilisant un Iterator


class BasicCollection<T> : IEnumerable<T> { private List<T> data = new List<T>();

public void FillList(params T [] items) { for (int i = 0; i < items.Length; i++) data.Add(items[i]); }
IEnumerator<T> IEnumerable<T>.GetEnumerator() { for (int i = 0; i < data.Count; i++) yield return data[i]; } IEnumerator IEnumerable.GetEnumerator() { // ... }

BasicCollection<string> bc = new BasicCollection<string>(); bc.FillList("Twas", "brillig", "and", "the", slithy", "toves"); foreach (string word in bc) Console.WriteLine(word);

Implmenter une interface en utilisant un Iterator


public IEnumerable<T> Reverse { get { for (int i = data.Count - 1; i >= 0; i--) yield return data[i]; } }

BasicCollection<string> bc = new BasicCollection<string>(); bc.FillList("Twas", "brillig", "and", "the", slithy", "toves"); ... foreach (string word in bc.Reverse) Console.WriteLine(word);

Chapitre 19 : Surcharger des oprateurs

Les contraintes sur les oprateurs

Il nest pas possible de changer la prcdence ou lassociativit dun oprateur. Il nest pas possible de changer la multiplicit dun operateur (le nombre doprandes). Il nest pas possible dinventer de nouveaux symboles doprateurs. Il nest pas permis de changer la signification dun oprateur.

Certains oprateurs ne peuvent tre surchargs.

Exemple: loprateur point (member access).

Surcharger un oprateur
struct Hour { public Hour(int initialValue) { this.value = initialValue; } public static Hour operator+ (Hour lhs, Hour rhs) { return new Hour(lhs.value + rhs.value); } ... private int value;

Un oprateur doit tre public. Un oprateur doit tre static. Un oprateur nest jamais polymorphique (pas de virtual, abstract, override, ou sealed). Un oprateur binaire a deux arguments explicites. Un oprateur unaire a un argument explicite

Crer des oprateurs symtriques


struct Hour { public Hour(int initialValue) { this.value = initialValue; } ... public static Hour operator+ (Hour lhs, Hour rhs) { return new Hour(lhs.value + rhs.value); } public static Hour operator+ (Hour lhs, int rhs) { return lhs + new Hour(rhs); } ... Hour a = ...; private int value; int b = ...; Hour sum = a + b; Hour som = b + a; // erreur

Dfinir des oprateurs dincrmentation


struct Hour { ... public static Hour operator++ (Hour arg) { arg.value++; return arg; } ... private int value; }

Hour now = new Hour(9); Hour postfix = now++;

Hour now = new Hour(9); Hour prefix = ++now;

Dfinir un oprateur dincrmentation pour une classe


class Hour { public Hour(int initialValue) { this.value = initialValue; } ... public static Hour operator++(Hour arg) { return new Hour(arg.value + 1); } ... private int value; }

Dfinir les oprateurs en paires

Les oprateurs qui vont en paire doivent tous les deux tre dfinis. Exemple: (== et !=), (< et >), (<= et >=), etc. Si les oprateurs == et != sont surchargs, il est recommand de surcharger Equals et GetHashCode
struct Hour { public Hour(int initialValue) { this.value = initialValue; } ... public static bool operator==(Hour lhs, Hour rhs) { return lhs.value == rhs.value; } public static bool operator!=(Hour lhs, Hour rhs) { return lhs.value != rhs.value; } ... private int value;

Implmenter des oprateurs de conversions

Implicite

struct Hour { ... public static implicit operator int (Hour from) { return this.value; }
}

class Example private int value; { public static void Method(int parameter) { ... } public static void Main() { Hour lunch = new Hour(12); Example.MyOtherMethod(lunch); } Explicite }

Example.MyOtherMethod((int)lunch);

Crer des oprateurs symtriques (rvis)


struct Hour { public Hour(int initialValue) { this.value = initialValue; } public static Hour operator+(Hour lhs, Hour rhs) { return new Hour(lhs.value + rhs.value); } public static implicit operator Hour (int from) { return new Hour (from); } ... Hour a = ...; private int value; int b = ...; Hour sum = a + b; Hour som = b + a;

Vous aimerez peut-être aussi