Pour compiler le C# en ligne : https://dotnetfiddle.net/


Votre premier programme

using System;   

public class Program // Le nom de cette classe n'est pas important
{
    public static void Main() // Le nom de cette fonction est important
    {
        //instructions ...
    }
}

Les types de variables en C

  1. Les types valeur : stockent des données
  2. Les types référence : stockent les références aux données

Les types valeur

Types simples

- sbyte, short, int, long
- byte, ushort, uint, ulong
- char
- float, double, decimal
- bool

Enum

enum Color{
    Green,
    Red,
    Black
}
...
Color c = Color.Green

Struct

Type défini par l’utilisateur

public struct Point {
    public double x;
    public double y;
}

Tuple

Structure de données utilisée pour stocker une collection d’éléments

(int, int) point = (0.5, 50)
Consle.WriteLine(point.Item2)

Types référence

Les classes

    class Student {
        ...
    }
    ...

    Student s = new Student();

Les interfaces

“Contrat” défini par l’utilisateur et qui doit être implémenté.

    interface ExampleInterface {
       ...
       void ExampleMethod();
    }
    class ImplementationClass : ExampleInterface{
        void ExampleMethod(){
            ...
        }
    }

Types références integrés

C# intégre des types référence dont object et string :

  • object alias de System.Object : Classe de base de tous les types
  • string alias de System.String : Classe représetant une chaine de caractères :

Le type string

    string message = "Bonjour";
  • l’opérateur + permet de concaténer deux string
    string name = "Azzeddine";
    string message = "Bonjour " + name;
  • l’opérateur [] permet d’accéder en lecture seule à un élément de la chaine
    name[1] // = 'z' 

Les tableaux

Structure de données permettant de stocker plusieurs variables du même type.


//tableau unidimensionnel de 100 cases de type int
int[] tab_1 = new int[100];
//tableau unidimensionnel de 3 cases
int[] tab_2 = [5, 50, 60]

//tableau multidimensionnel de 3 lignes et 2 colonnes
int[,] tab_3 = new int[3,2]
int[,] tab_4 = { {..,..},
               {..,..},
               {..,..}};

// tableau en escalier (ou tableau de tableaux)
int[][] tab_5 = new int[3][];

tab_5[0] = [1, 4, 17, 10];
tab_5[1] = [6,66];
tab_5[2] = [1, 33, 5];

Les instructions conditionnelles

if ( <expression_booléenne> ){
    //intructions
}
else if ( <expression_booléenne> ){
    //intructions
}
else {
    //intructions executées si les toutes les expressions précédentes ne sont pas vraies.
}

l’instruction switch

switch (variable){
    case valeur_1 :
        //instructions
        break;
    case valeur_1 :
        //instructions
        break;
    ...
    case valeur_n :
        //instructions
        break;
    default : 
        //instructions
        break;
}

Les instructions itératives

  • While
    while ( <condition> ){
        //instructions
    }
    int x = 10;
    while ( x > 0 ){
        x--; 
    }
  • do … While()
    do {
        //instructions
    } while ( condition );
    string answer;
    do {
        playGame();
        Console.WriteLine("Replay ?");
        answer = Console.ReadLine("Replay ?");
    } while ( answer != "NON" );

  • La boucle for
for (<instruction_1> ; <condition_arret>; <instruction_2>){
    // instructions
}
  • : exécuté 1 fois avant la première itération
  • : condition à vérifier pour arrêter la boucle
  • : instructions exécutées à la fin de chaque itération
for (int i = 100 ; i <= 500 ; i++){       
    if ( (i % 4) == 0 )
        Console.WriteLine(i);
}

  • La boucle foreach utilisée pour itérer sur des tableaux
foreach (type nomVariable in tableau) 
{
  // instructions
}
double[] temperatures = [12.5, 15, 13.2, 11.3, 10]
foreach (double temperature in temperatures) 
{
    Console.WriteLine(temperature);
}

La programmation orientée objet (POO)

  • Une classe contient les attributs et les méthodes des objets qu’elle représente.
  • A l’instantiacion, chaque objet pourra définir la valeur de ses attributs

Création d’une Classe

  • Les attributs peuvent être privés (par défaut) ou publiques.
public class Car{
    private string brand;
    private int nbDoor;
    string model;
}

  • Les méthodes peuvent être publiques ou privées.
public class Car{
    private string brand;
    private int nbDoor;
    string model;
    
    public void displayCarInfo(){
        Console.WriteLine( "Brand : " + this.brand );
        Console.WriteLine( "Number of doors : " + this.nbDoor );
        Console.WriteLine( "Model : " + this.model );
    }
    }

  • Le constructeur est une méthode spéciale appelée lorsqu’un objet est instancié
    • a le même nom que la classe
    • n’a pas de type de retour
public class Car{
    //Atrributes
    private string brand;
    private int nbDoor;
    string model;

    //Constructor 1
    public Car(){
        this.brand = "";
        this.nbDoor = 5;
        this.model = "";
    }
    //Constructor 2
    public Car(string brand, int nbDoor, string model){
        this.brand = brand;
        this.nbDoor = nbDoor;
        this.model = model;
    }

    //Methods
    public void displayCarInfo(){
        Console.WriteLine( "Brand : " + this.brand );
        Console.WriteLine( "Number of doors : " + this.nbDoor );
        Console.WriteLine( "Model : " + this.model );
    }
}

  • Les getters et les setters (en Java)
public class Car{
    //Atrributes
    private string brand;
    private int nbDoor;
    string model;
    
    ...
        
    public string getBrand {
        return brand;
    }
    
    public void setBrand (brand) {
        this.brand = brand
    }
}
Car c = new Car(); // instancie un objet
c.setBrand("Audi"); // modifie un attribut grâce au Setter
Console.WriteLine(c.getBrand()); Récupère sa valeur grâce au Getter

En C#, il existe ce qu’on appelle les Properties.

public class Car{

    private string brand;
    public string Brand{
        get {return brand;}
        set {return value;}
    }
    private int nbDoor;
    string model;
    
    ...

}
Car c = new Car(); // instancie un objet
c.Brand("Audi"); // modifie un attribut grâce au Setter
Console.WriteLine(c.Brand); //Récupère sa valeur grâce au Getter

On peut le rendre plus compact s’il n’y a pas d’avantage d’instructions dans le get et set.

public class Car{
 
    private string Brand {get; set;};
    private int nbDoor;
    string model{get; set;};
    
    ...
}

Exemple avec des instructions dans le setter.

public string Brand {get; set;}
private int nbDoor;
public int NbDoor {
    get { return nbDoor; }
    set{
        if(value != 3 && value != 5)
            return;
        nbDoor = value;
    }
}
public string Model {get; set;}


Les collections

  • Permettent de stocker et manipuler des données similaires.
  • Offrent de nombreuses méthodes.
## Exemple de collections avec élément à une valeur
## Exemple de collections avec élément à clé/valeur
- Hashtable - SortedList<TKey,TValue> - Dictionary<TKey,TValue>

Exemple

    List<int> l = new List<int>();
    l.Add(5); // ajoute 5 à la liste
    l.Add(2); // ajouter 2 à la liste
    l.RemoveAt(1); // supprime la valeur qui se trouve à l'indice 1
    
    Dictionary<string, int> panier = new Dictionary<string, double>();
    panier.Add("Chemise", 2);
    panier.Add("Jean", 1);
    

Les fonctions

En C#, il est possible de spécifier des paramètres avec les mots-clés in, out, et ref pour mieux contrôler comment les paramètres sont passés à la fonction.

Paramètre in

  • Utilisé pour passer un paramètre en lecture seule. Le paramètre est transmis par référence, mais ne peut pas être modifié à l’intérieur de la méthode.
public void DisplayValue(in int number)
{
    Console.WriteLine(number);
    // number = 5; // Provoquerait une erreur, car `in` empêche la modification
}

Paramètre out

  • Utilisé lorsque la méthode doit renvoyer plusieurs valeurs. le mot clé out est nécessaire également dans l’appel à la fonction.
public void Divide(int a, int b, out int quotient, out int remainder)
{
    quotient = a / b;
    remainder = a % b;
}

int q, r;
Divide(10, 3, out q, out r); // q = 3, r = 1

Paramètre ref

  • Utilisé pour passer une référence à une variable, permettant à la méthode de modifier la variable en dehors de la méthode.
public void Increment(ref int number)
{
    number++;
}

int value = 5;
Increment(ref value); // Après l'appel, value sera égale à 6

Les Events

“Les Events sont basés sur le modèle délégué. Le modèle délégué suit le modèle de conception observateur, qui permet à un abonné de s’inscrire pour recevoir des notifications d’un fournisseur. Un émetteur d’événements émet une notification d’événement, et un récepteur d’événements reçoit cette notification et définit une réponse à celle-ci.””

Déclaration d’un Event

Un event est basé sur le modèle délégué, qui définit la signature de la méthode qui sera appelée lorsqu’un event est déclenché. Voici un exemple simple d’event :

// Déclaration d'un délégué
public delegate void ThresholdReachedEventHandler(object sender, EventArgs e);

// Déclaration d'une classe avec un event
public class Thermostat
{
    public event ThresholdReachedEventHandler ThresholdReached;

    private int temperature;

    public void SetTemperature(int temp)
    {
        temperature = temp;
        if (temperature >= 30) // Seuil atteint
        {
            OnThresholdReached(EventArgs.Empty);
        }
    }

    protected virtual void OnThresholdReached(EventArgs e)
    {
        // Si quelqu'un est abonné à l'événement, déclenche-le
        if (ThresholdReached != null)
        {
            ThresholdReached(this, e);
        }
    }
}

Utilisation d’un Event

Pour écouter un event, il faut y souscrire avec une méthode qui sera exécutée quand l’event est déclenché :

public class Program
{
    public static void Main()
    {
        Thermostat t = new Thermostat();
        
        // Souscription à l'event
        t.ThresholdReached += OnThresholdReached;

        t.SetTemperature(32); // Déclenche l'événement
    }

    static void OnThresholdReached(object sender, EventArgs e)
    {
        Console.WriteLine("Seuil de température atteint !");
    }
}

Dans cet exemple, quand la température atteint ou dépasse 30, l’event ThresholdReached est déclenché et la méthode OnThresholdReached est appelée.

Les Fonctions Lambda et Les Expressions Lambda

En C#, les expressions lambda sont des fonctions anonymes utilisées pour créer des méthodes locales rapides et concises. Elles sont particulièrement utiles avec les collections et les événements.

List<int> numbers = new List<int>() { 1, 2, 3, 4, 5 };

// Utilisation d'une expression lambda pour filtrer la liste
var evenNumbers = numbers.Where(n => n % 2 == 0);

foreach (var num in evenNumbers)
{
    Console.WriteLine(num); // Affiche 2 et 4
}

Les lambdas sont souvent utilisées pour des événements également :

t.ThresholdReached += (sender, e) => Console.WriteLine("Température trop élevée !");