Code | Remarques |
using System; namespace Exemples { class Planete { // champs private string nom; private double gravite; // constructeur public Planete(string n, double g) { nom = n; gravite = g; } // propriétés public string Nom { get { return nom; } } public double Gravite { get { return gravite; } } } } |
Voilà la classe Planete... |
Code | Remarques |
using System; namespace Exemples { class Spationaute { // champs private double masse; private Planete planeteCourante; // constructeur public Spationaute(double m) { masse = m; } // propriété public Planete PlaneteCourante { get { return planeteCourante; } set { planeteCourante = value; } } // méthode public double Poids() { double poids = 0; if (planeteCourante == null) { Console.WriteLine("On est bien dans l'espace..."); } else { poids = masse * planeteCourante.Gravite; Console.WriteLine("Le poids est de {0} N sur {1}", poids, planeteCourante.Nom); } return poids; } } } |
Voilà la classe Spationaute |
Code | Résultat | Remarques |
using System; namespace Exemples { class Spationaute { // champs private double masse; private Planete planeteCourante; // constructeur public Spationaute(double m) { masse = m; } // propriété public Planete PlaneteCourante { get { return planeteCourante; } set { planeteCourante = value; } } // méthode public double Poids() { double poids = 0; if (planeteCourante == null) { Console.WriteLine("On est bien dans l'espace..."); } else { poids = masse * planeteCourante.Gravite; Console.WriteLine("Le poids est de {0} N sur {1}", poids, planeteCourante.Nom); } return poids; } } } |
Terre : 9,78 m/s² Lune : 1,622 m/s² On est bien dans l'espace... Le poids est de 880,2 N sur Terre Le poids est de 145,98 N sur Lune |
Voilà le résultat de ce petit test... |
csc Test.cs Planete.cs Astronaute.csDans les sections suivantes, nous regarderons chacun des types membres qu'une classe peut avoir, tels que :
Code | Résultat | Remarques |
using System; namespace Exemples { class Personne { // champ private string nom; // constructeur public Personne(string nom) { this.nom = nom; } // méthode public void Presenter(Personne p) { if (p != this) { Console.WriteLine("Bonjour, je m'appelle " + nom); } } } class MotCleThis { static void Main(string[] args) { Personne rudy = new Personne("Rudy"); Personne eric = new Personne("Eric"); rudy.Presenter(rudy); rudy.Presenter(eric); Console.ReadKey(); } } } |
Bonjour, je m'appelle Rudy |
Voilà le résultat d'une "auto-présentation" (rien) et de la présentation de Rudy à Eric... |
Code | Résultat | Remarques |
using System; namespace Exemples { class MaClasse { // champs public int x; public float y = 1, z = 2; public static readonly int maxSize = 33; public const double pi = 3.14159265358979323846; // ... // méthodes public static void AfficheChampsStatic() { Console.WriteLine("maxSize = " + maxSize); Console.WriteLine("pi = " + MaClasse.pi); } public void AfficheChamps() { Console.WriteLine("x = " + x + ", y = " + y + ", z = " + z); } } class Champs { static void Main(string[] args) { MaClasse.AfficheChampsStatic(); MaClasse c = new MaClasse(); c.AfficheChamps(); c.x++; c.y++; c.z++; c.AfficheChamps(); Console.ReadKey(); } } } |
maxSize = 33 pi = 3.14159265358979 x = 0, y = 1, z = 2 x = 1, y = 2, z = 3 |
Dans cet exemple, on à 4 champs (public) dont un static et readonly. Ce champ static est accessible directement à partir de la classe (et donc même sans instance). On a également une constante... |
Code | Résultat | Remarques |
using System; namespace Exemples { public class Tirelire { // champ privé decimal euros; // Propriété public int Centimes { get { return (int)(euros * 100); } set { euros = (decimal)value / 100; } } } class Proprietes { static void Main(string[] args) { Tirelire t = new Tirelire(); t.Centimes = 25; // définit (set) Console.WriteLine(t.Centimes); int x = t.Centimes; // obtient (get) Console.WriteLine(x); t.Centimes += 50; // obtient et définit (met une pièce dans la tirelire) Console.WriteLine(t.Centimes); Console.ReadKey(); } } } |
25 25 75 |
Utilisation des accesseurs get et set... |
Code | Résultat | Remarques |
using System; namespace Exemples { public class Resultats { // 5 juges => 5 notes int[] notes = new int[5]; // indexeur public int this[int index] { get { return notes[index]; } set { if (value >= 0 && value <= 10) notes[index] = value; } } // propriété (lecture seule) public double Moyenne { get { double somme = 0; foreach (int note in notes) somme += note; return somme / notes.Length; } } } class Indexeurs1 { static void Main(string[] args) { Resultats r = new Resultats(); r[0] = 10; r[1] = 8; r[2] = 7; r[3] = r[4] = r[1]; Console.WriteLine(r.Moyenne); Console.ReadKey(); } } } |
8,2 |
Dans cet exemple, la classe Resultats préserve les notes données par 5 juges. L'indexeur utilise un simple index int pour obtenir ou définir la note particulière donnée par un juge. La moyenne est calculé dans la propriété Moyenne en lecture seule. |
Code | Résultat | Remarques |
using System; namespace Exemples { public class Resultats { // 5 juges string[] juges = new string[5]; // 5 notes int[] notes = new int[5]; // indexeur public int this[int index, string juge] { get { return notes[index]; } set { if (value >= 0 && value <= 10) { notes[index] = value; juges[index] = juge; } } } // propriété (lecture seule) public double Moyenne { get { double somme = 0; foreach (int note in notes) somme += note; return somme / notes.Length; } } // Méthode public void Synthese() { for (int index = 0; index < 5; index++) Console.WriteLine(juges[index] + " : " + notes[index]); Console.WriteLine("MOYENNE : " + this.Moyenne); } } class Indexeurs2 { static void Main(string[] args) { Resultats r = new Resultats(); r[0, "Rudy"] = 10; r[1, "Michael"] = 8; r[2, "Antoine"] = 7; r[3, "Valentin"] = 8; r[4, "Eric"] = 8; r.Synthese(); Console.ReadKey(); } } } |
Rudy : 10 Michael : 8 Antoine : 7 Valentin : 8 Eric : 8 MOYENNE : 8,2 |
Dans cet exemple, l'indexeur possède deux paramètres : le numéro du juge (l'index) et son nom. |
Code | Résultat | Remarques |
using System; namespace ConsoleApplication2 { class Methodes { public static void Methode(int x) { Console.WriteLine("int x : " + x); } public static void Methode(double x) { Console.WriteLine("double x : " + x); } public static void Methode(int x, float y) { Console.WriteLine("int x : " + x + ", float y : " + y); } public static void Methode(float x, int y) { Console.WriteLine("float x : " + x + ", int y : " + y); } public static void Methode(ref int x) { Console.WriteLine("ref int x : " + x); } } class SurchargerMethodes { static void Main(string[] args) { Methodes.Methode(33); Methodes.Methode(33D); Methodes.Methode(33, 91F); Methodes.Methode(33F, 91); int i = 33; Methodes.Methode(ref i); Console.ReadKey(); } } } |
int x : 33 double x : 33 int x : 33, float y : 91 float x : 33, int y : 91 ref int x : 33 |
Par exemple, ces 5 méthodes peuvent coexister dans le même type... |
using System; namespace Exemples { class MaClasse { // constructeur public MaClasse() { // code d'initialisation } } class Constructeur { static void Main(string[] args) { MaClasse c = new MaClasse(); Console.ReadKey(); } } }Une classe ou une structeur peut surcharger les constructeurs et peut appeler l'un de ses constructeurs surchargés avant d'exécuter la méthode en utilisant le mot-clé this :
Code | Résultat | Remarques |
using System; namespace Exemples { class MaClasse { // champ public int x; // constructeurs public MaClasse() : this(33) {} public MaClasse(int v) { x = v; } } class InstanceConstructeurs { static void Main(string[] args) { MaClasse c1 = new MaClasse(); MaClasse c2 = new MaClasse(91); Console.WriteLine(c1.x); // affiche 33 Console.WriteLine(c2.x); // affiche 91 Console.ReadKey(); } } } |
33 91 |
Le constructeur sans argument lance le constructeur avec argument (avec comme valeur 33). |
Code | Résultat | Remarques |
using System; namespace Exemples { class MaClasse { // champ public int x = 33; } class OrdreInitialisationChamps { static void Main(string[] args) { MaClasse c = new MaClasse(); Console.WriteLine(c.x); // affiche 33 Console.ReadKey(); } } } |
33 |
Le champ x est initialiser à 33... |
Code | Résultat | Remarques |
using System; namespace Exemples { class MaClasse { // champ public static int x = 33; // constructeur statique static MaClasse() { Console.WriteLine("MaClasse initialisée"); } } class ConstructeursStatiques { static void Main(string[] args) { Console.WriteLine(MaClasse.x); // affiche MaClasse initialisée et 33 Console.ReadKey(); } } } |
MaClasse initialisée 33 |
Voilà un exemple de constructeur statique. L'accès à MaClasse.x assigne 33 à x et affiche MaClasse initialisée. |
Code | Résultat | Remarques |
using System; namespace Exemples { class MaClasse { // champ public static int x = 33; // constructeur statique static MaClasse() { Console.WriteLine("MaClasse initialisée"); } // méthode public static void AfficheX() { Console.WriteLine(MaClasse.x); } } class OrdreInitialisationChampsStatiques { static void Main(string[] args) { MaClasse.AfficheX(); // affiche MaClasse initialisée et 33 Console.ReadKey(); } } } |
MaClasse initialisée 33 |
Voilà un exemple de constructeur statique. L'accès à MaClasse.AfficheX() assigne 33 à x et affiche MaClasse initialisée. |
Code | Résultat | Remarques |
using System; namespace Exemples { class MaClasse1 { // champ public static int x = 33; // constructeur statique static MaClasse1() { Console.WriteLine("MaClasse1 initialisée"); } // méthode public static void AfficheX() { Console.WriteLine(x); } } class MaClasse2 { // champ public static int x = 91; // constructeur statique static MaClasse2() { Console.WriteLine("MaClasse2 initialisée"); } // méthode public static void AfficheX() { Console.WriteLine(x); } } class NonDeterminismeConstructeursStatiques { static void Main(string[] args) { MaClasse1.AfficheX(); // affiche MaClasse1 initialisée et 33 MaClasse2.AfficheX(); // affiche MaClasse2 initialisée et 33 Console.ReadKey(); } } } |
MaClasse1 initialisée 33 MaClasse2 initialisée 91 |
Dans cet exemple, MaClasse1 initialisée peut être affiché après MaClasse2 initialisée (même si je n'ai pas réussi à rencontrer ce cas après plus d'une dizaine d'essais :-) |
Code | Résultat | Remarques |
using System; namespace Exemples { class MaClasse { // champ public int x = 33; // constructeur public MaClasse() { Console.WriteLine("MaClasse initialisée"); } // méthode public void AfficheX() { Console.WriteLine(x); } // destructeur ~MaClasse() { Console.WriteLine("MaClasse detruite"); } } class DestructeursFinaliseurs { static void Main(string[] args) { MaClasse c = new MaClasse(); c.AfficheX(); // affiche MaClasse initialisée et 33 Console.ReadKey(); // MaClasse detruite s'affiche à la fin du programme... } } } |
MaClasse initialisée 33 MaClasse detruite s'affiche à la fin du programme... |
Le déstructeur est lancé automatiquement par le ramasse-miettes... |
Code | Résultat | Remarques |
using System; namespace Exemples { class A { int x = 33; // membre privé protected internal class Imbrique { public void AfficheX() { A a = new A(); Console.WriteLine(a.x); } } } class B : A { new public class Imbrique { } // cache le membre hérité } class TypesImbriques { static void Main(string[] args) { A.Imbrique i1 = new A.Imbrique(); i1.AfficheX(); // affiche 33 B.Imbrique i2 = new B.Imbrique(); // i2.AfficheX() n'existe pas... Console.ReadKey(); } } } |
33 |
Voici un exemple d'utilisation de type imbriqué... |