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
- Les types valeur : stockent des données
- 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.Green Color c
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)
.WriteLine(point.Item2) Consle
Types référence
Les classes
class Student {
...
}
...
= new Student(); Student s
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 deSystem.Object
: Classe de base de tous les typesstring
alias deSystem.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
[1] // = 'z' name
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][];
[0] = [1, 4, 17, 10];
tab_5[1] = [6,66];
tab_5[2] = [1, 33, 5]; tab_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();
.WriteLine("Replay ?");
Console= Console.ReadLine("Replay ?");
answer } 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 )
.WriteLine(i);
Console}
- 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)
{
.WriteLine(temperature);
Console}
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(){
.WriteLine( "Brand : " + this.brand );
Console.WriteLine( "Number of doors : " + this.nbDoor );
Console.WriteLine( "Model : " + this.model );
Console}
}
- 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(){
.WriteLine( "Brand : " + this.brand );
Console.WriteLine( "Number of doors : " + this.nbDoor );
Console.WriteLine( "Model : " + this.model );
Console}
}
- 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
}
}
= new Car(); // instancie un objet
Car c .setBrand("Audi"); // modifie un attribut grâce au Setter
cConsole.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;
...
}
= new Car(); // instancie un objet
Car c .Brand("Audi"); // modifie un attribut grâce au Setter
c.WriteLine(c.Brand); //Récupère sa valeur grâce au Getter Console
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;
= value;
nbDoor }
}
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
<int> l = new List<int>();
List.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
l
<string, int> panier = new Dictionary<string, double>();
Dictionary.Add("Chemise", 2);
panier.Add("Jean", 1);
panier
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)
{
.WriteLine(number);
Console// 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)
{
= a / b;
quotient = a % b;
remainder }
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)
{
= temp;
temperature 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()
{
= new Thermostat();
Thermostat t
// Souscription à l'event
.ThresholdReached += OnThresholdReached;
t
.SetTemperature(32); // Déclenche l'événement
t}
static void OnThresholdReached(object sender, EventArgs e)
{
.WriteLine("Seuil de température atteint !");
Console}
}
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.
<int> numbers = new List<int>() { 1, 2, 3, 4, 5 };
List
// Utilisation d'une expression lambda pour filtrer la liste
var evenNumbers = numbers.Where(n => n % 2 == 0);
foreach (var num in evenNumbers)
{
.WriteLine(num); // Affiche 2 et 4
Console}
Les lambdas sont souvent utilisées pour des événements également :
.ThresholdReached += (sender, e) => Console.WriteLine("Température trop élevée !"); t