Académique Documents
Professionnel Documents
Culture Documents
0
propos par Nadia HADDOUCHE epse CHETTA
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"); } } }
Utiliser lindentation C# est case sensitive Les espaces blancs sont ignors Une ligne de commentaire est indique par //
Dclarer un namespace
Namespaces imbriqus
namespace CompanyName { namespace Sales { public class Customer () { } } } // Or namespace CompanyName.Sales { ... }
La dclaration using
Les mots cl de C#
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
Les Variables doivent tre dfinies avant de les utiliser Utiliser la camelCase convention pour nommer les variables
3 Terminer par un ;
Initialisation
1
Dclare en utilisant le mot cl const et un type Sa valeur est affecte au moment de la dclaration
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
Oprateurs communs
Exemple
Incrmenter/dcrmenter ++ --
Arithmtique
Relationnel Egalit Conditionnel Affectation
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
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
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); }
Oprateurs Signification
Exemple
Rsultat si age = 42
==
!=
gale
diffrent
Oprateurs
Signification
Exemple
Rsultat si age = 42
Oprateurs Signification
Exemple
(percent >= 0) && (percent <= 100); (percent >= 0) || (percent <= 100);
&&
||
et
ou
if
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; } }
dayName = "Sunday"; break; dayName = "Monday"; break; dayName = "Tuesday"; break; dayName = "Unknown"; break;
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;
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
Ne pas crire
crire
variable = variable * number; variable = variable / number; variable = variable % number; variable = variable + number; variable = variable - number;
variable += variable;
variable -= variable;
Un test est effectu au dbut de la boucle, si le test est False, la boucle nest jamais excute
continue, break
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
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
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
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 ... }
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
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
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).
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.
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"); }
Les classes d exceptions prdfinies dans le common language runtime Exemple: ArithmeticException, FileNotFoundException Les exceptions dfinies par lutilisateur
TextReader reader = null; try { reader = src.OpenText(); string line; while ((line = reader.ReadLine()) != null) source.Text += line + "\n"; } } finally { if (reader != null) { reader.Close(); } }
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
Objet
public class Customer { public string name; public decimal creditLimit; public uint customerID; }
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.
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
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
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
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); } }
Il est possible dorganiser la dfinition dune grande classe en de petits morceaux plus faciles grer.
Membre Static
Appartient la classe Initialis avant la cration dune instance de la classe Partag par toutes les instances de la classe
class Lion { public static string family = "felidae"; } ... // un objet Lion na pas t cr dans ce code Console.WriteLine( "Family: {0}", Lion.family );
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
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.
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
class Lion { private int weight; public void SetWeight(int newWeight) { weight = newWeight; } } . . .
Lion bigLion = new Lion(); int bigLionWeight = 250; bigLion.SetWeight( bigLionWeight );
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
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 .
unboxing
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
class Example { public void Method(Season parameter) { Season localVariable; ... } private Season currentSeason; }
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
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.
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
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; }
struct Time { public Time(int hh, int mm){ hours = hh; minutes = mm; seconds = 0; } ... private int hours, minutes, seconds; }
Time now; Time copy = now; // compile time error: now unassigned
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
Instantier un array
Initialiser un array
string[] animal = {"Mouse", "Cat", "Lion"}; animal[1]= "Elephant"; string someAnimal = animal[2];
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); }
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.
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
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 }
Enqueue place les objets dans la queue Dequeue supprime les objets de 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 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
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#"
foreach (DictionaryEntry element in ages) { string name = (string)element.Key; int age = (int)element.Value; Console.WriteLine("Name: {0}, Age: {1}", name, age); }
SortedList
ages = new
SortedList ();
// Remplir 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); }
A ne pas faire
params ne peut tre utilise que pour des arrays dune dimension.
public static int Min(params int[,] table)
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)
Chapitre 12 : Lhritage
1 2
Process-Centered
Reveals Data
Hides Data
3
4 5
Single Unit
Modular Units
One-Time Use
Reusable
Ordered Algorithm
Nonordered Algorithm
Encapsulation
Rendre le fonctionnement des choses sans changer leur interaction avec lutilisateur Rendre lobjet plus facile utiliser
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
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"); } }
class KeywordToken : Token { ... } ... IdentifierToken it = new IdentifierToken(); KeywordToken kt = it; // erreur types diffrents
IdentierToken it = new IdentifierToken(); Token t = it; // lgal
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 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());
Le mot cl base est utilis pour appeler une mthode dans la classe de base partir de la classe drive
{
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.
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
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.
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
interface ICarnivore { bool IsHungry { get; } Animal Hunt(); void Eat(Animal victim); }
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 ); }
public class Zoo : IEnumerable { . . . public IEnumerator GetEnumerator() { return (IEnumerator)new ZooEnumerator( this ); }
Contient une mthode abstract qui doit tre implmente par une classe drive
public abstract class Animal { public abstract void Eat(); public abstract Group PhylogenicGroup { get; } }
Il est impossible de crer une classe drive partir dune classe sealed Une classe sealed ne contient pas de mthodes virtual
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.
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 sealed
struct no no no 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.
Ecrire un destructeur
class Tally { public Tally() { this.instanceCount++; } ~Tally() { this.instanceCount--; } public static int InstanceCount() { return this.instanceCount; } ... private static int instanceCount = 0; }
Il nest pas possible de dclarer un destructeur dans une struct. struct Tally
{ }
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) { ... }
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:
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();
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); } }
Les proprits sont des mthodes qui protgent laccs aux membres dune classe
private int animalWeight; public int Weight { get { return animalWeight; } set { animalWeight = value; } }
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 .
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
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);
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;
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 Name this [ PhoneNumber number ] { ... } public PhoneNumber this [ Name name ] { ... }
Wrapper wrap = new Wrapper(); ... int[] myData = new int[2]; myData[0] = wrap[0]; myData[1] = wrap[1]; myData[0]++; myData[1]++;
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
Lion CheckGriffes
Antilope CheckSabots
public void Add(stopMachineryDelegate stopMethod) { this.stopMachinery += stopMethod; } public void Remove(stopMachineryDelegate stopMethod) { this.stopMachinery -= stopMethod; } public void ShutDown() { this.stopMachinery(); } private stopMachineryDelegate stopMachinery;
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();
void StopFolding(int shutDownTime); ... void FinishFolding() { folder.StopFolding(0); } ... this.stopMachinery += FinishFolding;
et
control.Add(delegate { folder.StopFolding(0); } );
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
Proprit
Dclarer un Event
class TemperatureMonitor {
Souscrire un Event
TemperatureMonitor tempMonitor = new TemperatureMonitor();
...
tempMonitor.MachineOverheating += delegate { folder.StopFolding(0) }; tempMonitor.MachineOverheating += welder.FinishWelding;
tempMonitor.MachineOverheating += painter.PaintOff;
Dclencher un Event
class TemperatureMonitor { public delegate void StopMachinerDelegate; public event StopMachineryDelegate MachineOverheating; ... private void Notify() { if (this.MachineOverheating != null) { this.MachineOverheating(); } } ... }
namespace System.Windows.Forms { public class Control : { public event EventHandler Click; ... } public class Button : Control { ... } }
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
Donc
using System.Collections.Generic; ... Queue<Circle> myQueue = new Queue<Circle>(); Circle myCircle = new Circle(); myQueue.Enqueue(myCircle); ... myCircle = myQueue.Dequeue();
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"];
Il est possible dajouter des contraintes sur les lments pour une classe generic
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.
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
Exemple
int a = 1, b = 2; Swap<int>(ref a, ref b); ... string s1 = "Hello", s2 = "World"; Swap<string>(ref s1, ref s2);
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();
IEnumerator<T> et IEnumerable<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);
BasicCollection<string> bc = new BasicCollection<string>(); bc.FillList("Twas", "brillig", "and", "the", slithy", "toves"); ... foreach (string word in bc.Reverse) Console.WriteLine(word);
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.
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
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;
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);