Cours DotNet C# Part1
Cours DotNet C# Part1
Cours DotNet C# Part1
NET
et
Langage C#
Pr. Abderrahim BENABBOU
abderrahim.benabbou@gmail.com
Partie I
La plateforme Microsoft .NET
2
© A. Benabbou
Présentation
4
© A. Benabbou
Présentation
5
© A. Benabbou
.NET Core
6
© A. Benabbou
.NET MAUI
MAUI est une API qui permet de créer une application multi
plateformes avec un seul projet sous visual studio : le code métier et
le design de l’IU est partagé par toutes les plateformes
7
© A. Benabbou
.NET Framework
10
© A. Benabbou
Architecture de .NET Framework
Common Language Runtime (CLR)
Le CLR est l'environnement d'exécution du .NET Framework
Le CLR est la machine virtuelle de Microsoft
Le CLR est indépendant de l'architecture physique de la machine
Le CLR exécute un bytecode écrit dans un langage intermédiaire
nommé MSIL (Microsoft Intermediate Language ) ou simplement
IL
Les tâches essentielles de CLR sont :
• le chargement des classes,
• la vérification de types,
• la gestion de la mémoire (Garbage Collector), des exceptions et
de la sécurité,
• l’exécution du code IL
12
© A. Benabbou
Architecture de .NET Framework
Common Language Runtime (CLR)
L’exécution par le CLR se traduit par une compilation JIT (Just-
In-Time) : traduction à la volée du code IL appelé aussi code
managé, en code natif
Compilateur CLR
Assembly
Code Source Code natif
Code IL
.DLL ou .EXE
C#, C++ managé, VB.NET
ou un autre langage
15
© A. Benabbou
Architecture de .NET Framework
.NET Framework Base Classes
System
Collections IO Security Runtime
Configuration Net ServiceProcess InteropServices
System.Web System.Windows.Forms
Services UI Form Button
Description HtmlControls MessageBox ListControl
Discovery WebControls
Protocols System.Drawing
Caching Security Drawing2D Printing
Configuration SessionState Imaging Text
System.Data System.Xml
OLEDB SQL XSLT Serialization
Design SQLTypes XPath
16
© A. Benabbou
Architecture de .NET Framework
.NET Framework Base Classes
Exemples de classes
– System : types de base (Object, Byte, Char, etc.) et la la
classe Console
– System.Collections : Collections d'objets (ArrayList,
Dictionary, SortedList, Stack, etc.)
– System.Data : Interaction avec les bases de données
(DataRow, DataSet, DataTable, DataSource, etc.)
– System.IO : Accès aux fichiers (File, FileStream,
StreamReader, StreamWriter, etc.)
17
© A. Benabbou
Architecture de .NET Framework
.NET Framework Base Classes
23
© A. Benabbou
Partie II
Le langage C#
24
© A. Benabbou
Introduction
C# est un langage à objets récent disponible officiellement depuis février 2002
Evolution:
– C# 1.0 : très proche de Java, mais reste syntaxiquement semblable au
langages C et C++
– C# 2.0 : apporte la notion des classes génériques, des classes partielles, des
méthodes anonymes, etc.
– C# 3.0 : intègre Linq, l’inférence des types locaux, les types anonymes, les
initialiseurs d’objets, etc.
– C# 4.0 : apporte les fonctionnalités de la programmation dynamique et de
la coévolution des langages
– …
– C# 11: la dernière version (bientôt la version 12)
25
© A. Benabbou
Introduction
26
© A. Benabbou
Caractéristiques
Syntaxe proche de C/C++ et de Java
La classe contient sa définition et son implémentation, dans un
même fichier d’extension «.cs»
Utilisation des espaces de noms pour le groupement de plusieurs classes
Tout est classe même les types de base int , float, etc.
Toutes les classes héritent de la classe racine object
(System.Object)
Seul l’opérateur d’accès aux membres . est utilisé
Le compilateur C# peut générer un fichier de documentation XML à
partir de commentaires spéciaux inclus dans le programme
Généralisation de la gestion des exceptions
L’héritage est simple mais une classe peut implémenter plusieurs
interfaces
Support natif des threads
27
© A. Benabbou
Structure générale d’une application C#
30
© A. Benabbou
Structure générale d’une application C#
Exemple : prog.cs
//espaces de noms utilisés
using System; //contient la classe Console
//Déclaration d’un espace de noms
namespace MonEspace{
class Test{
37
© A. Benabbou
La gestion des exceptions
Remarques
- On peut utiliser catch sans paramètres si on n’a pas besoin de connaître des
informations sur l’exception :
catch{
…
}
- On peut générer explicitement une exception à l’aide de l’instruction :
throw new TypeException("message");
- On peut relancer une exception après sa capture dans une clause catch à l’aide
de l’instruction
throw;
38
© A. Benabbou
Types en C#
40
© A. Benabbou
Types valeur de C#
Boxing/Unboxing
Le Boxing/Unboxing représente un concept principal dans le
système des types valeur de C#
Il fournit un mécanisme de conversion automatique entre les types
valeur de C# et les classes références .NET
–Le Boxing est la conversion d’une expression de type valeur en un objet
d’une classe .NET
–La conversion inverse s'appelle Unboxing
Exemple : Le type int est l’équivalent de la classe System.Int32
int i=132; //ou Int32 o=132;
Object obj=i;//boxing
int j= (int)obj;//unboxing
Remarque : pour les conversions entre types de C# on peut utiliser
les méthodes statiques de la classe System.Convert
41
© A. Benabbou
Types valeur de C#
Classes équivalentes dans .NET
Type valeur de C# Classe équivalente dans .NET
byte System.Byte
sbyte System.SByte
char System.Char
short System.Int16
ushort System.UInt16
int System.Int32
uint System.UInt32
long System.Int64
ulong System.UInt64
float System.Single
double System.Double
decimal System.Decimal
bool System.Boolean
42
© A. Benabbou
Types valeur de C#
Type enum
Un type enum (énumération) est un type valeur qui permet de
définir une classe (ensemble) de constantes
Ces constantes sont des valeurs entières à partir de 0
Un type enum est équivalent à la classe System.Enum
Déclaration : enum nomType {Nom1, Nom2, …}
Exemple :
enum Etat{Fermé, Ouvert}//Ferme0 et Ouvert1
Etat etat0 = Etat.Fermé;
int val= (int)etat0 ; //val 0
Console.WriteLine( "état="+etat0); // état=Fermé
Remarque : Il est possible d'attribuer des valeurs personnalisées à
une ou à plusieurs constantes de l'énumération , exemple :
enum Climat { froid=-10, chaud=37}
43
© A. Benabbou
Types valeur de C#
Type struct
Un type struct définit une classe dont les instances sont des objets et
non des références (l’opération new n’est pas nécessaire)
On ne peut pas hériter à partir d’une classe struct
Les classes des types de base dans .NET comme int (System.Int32)
char, etc. sont des définies comme struct
Déclaration
struct nomType {
// attributs
// méthodes et constructeurs
}
44
© A. Benabbou
Types valeur de C#
Type struct
Exemple :
struct personne{
public string nom;
public int age;
}
public class test {
public static void Main() {
personne p1;
p1.nom = "Ali";
p1.age = 10;
personne p2 = p1; //recopie du contenu
}
}
45
© A. Benabbou
Types référence de C#
La classe object
46
© A. Benabbou
Types référence de C#
Les tableaux
Les tableaux dérive de la classe abstraite System.Array
Un débordement du tableau génère une exception
IndexOutOfRangeException
Tableau unidimensionnel
Type[] Tab = new Type[dimension];
Initialisation lors de la déclaration :
Type[] Tab = new Type[]{val0,val1,val2,…};
ou: Type[] Tab = {val0,val1,val2,…};
ou: Type[] Tab;
Tab = new Type[] {val0,val1,val2,…};
La propriété Length contient le nombre d'éléments
int l = Tab.Length;
47
© A. Benabbou
Types référence de C#
Les tableaux
Tableau à plusieurs dimensions
Chaque ligne contient le même nombre de cases
Type[,,,…] Tab=new Type [dim1,dim2,dim3,…];
Exemple : Tableau à deux dimensions
int[,] T1= new int[7,5];//7 lignes et 5 colonnes
int[,] T2= new int[3,2] {{0,1},{3,4},{6,7}};
int[,] T3= new int[,] {{0,1},{3,4},{6,7}};
int[,] T4= {{0,1}, {3,4}, {6,7}};
int n=T1.Length; //n35=7*5:nombre total de cases
int i=T2[1,0]; // i3:2ème ligne et 1ère colonne
int L1= T3.GetLength(1); /*L12 : nombre de
colonnes de la 2ème ligne */
48
© A. Benabbou
Types référence de C#
Les tableaux
Tableau de tableaux ( tableau en escalier )
- Chaque ligne contient son propre nombre de cases
- On ne doit spécifier que la 1ère dimension
Type[][]…[] Tab=new Type[dim1][]…[];
Exemple : Tableau à deux dimensions
int[][] T1= new int[2][ ];
int[][] T2= {new int[]{2,3,4},
new int[]{5,6,7,8,9}};
T1[0]=new int[3];
T1[0][0]=15;
T1[1]=new int[5];
49
© A. Benabbou
Types référence de C#
Les tableaux
Copie de tableaux
La méthode Clone : renvoie une référence sur un nouveau objet copie d’un tableau tab1
Type [] tab2 = (Type[]) tab1.Clone();
La méthode statique Copy de Array : permet de copier du tableau tab1 vers tab2 un nombre
d’éléments nbelements
Array.Copy (tab1, tab2, nbElements);
Syntaxe complète: Array.Copy (tab1,indice1,tab2,indice2, nbElements);
La méthode CopyTo : permet de copier dans un tableau tab2 tous les éléments d’un tableau tab1 en
les stockant à partir de l’indice i de tab2
tab1.CopyTo (tab2, i);
Tri de tableaux
La méthode statique Array.Sort(tab) trie un tableau tab dans l’ordre croissant par défaut
Inversion des éléments d’un tableau
La méthode statique Array.Reverse(tab) inverse l’ordre des éléments de tout le tableau tab
Redimensionnement d’un tableau
La méthode statique Array.Resize(ref tab, newDim) redimensionne le tableau tab avec la
nouvelle dimension newDim en préservant le contenu
50
© A. Benabbou
Types référence de C#
Les tableaux
Plage d’éléments d’un tableau
On peut accéder à une plage d’éléments d’un tableau:
- Tout le tableau:
tab1=tab2[..];
- Une plage entre deux indices du tableau:
tab1=tab2[indice1..indice2]; (indice1<=plage<indice2)
- A partir d’un indice jusqu’à la fin du tableau:
tab1=tab2[indice1..]; (indice1<=plage<tab1.Length):
Position à partir de la fin d’un tableau
- Un élément à la position pos à partir de la fin du tableau:
element=tab2[^pos]; (pos>=1, le dernier élément est à la 1ère position à partir de la fin)
-Plage d’éléments entre deux positions par rapport à la fin du tableau:
tab1=tab2[^pos2..^pos1]; (pos1<plage<=pos2)
-Plage d’éléments à partir d’une position par rapport à la fin du tableau (pos>=1):
tab1=tab2[^pos..];
51
© A. Benabbou
Types référence de C#
Les chaînes de caractères
Le type string
- Le type string est l’équivalent de la classe System.String
- Une chaîne de type string ne peut pas être modifiée
Déclaration
string chaine;
Déclaration avec initialisation
string chaine = "message";
ou: string chaine = new string(…);//plusieurs
//surcharges
Affectation par l'opérateur = :
string chaine;
chaine = "message";
Test d’égalité (inégalité) des chaînes par l’opérateur == (et !=) :
if (chaine1 == chaine2) …
Comparaison des chaînes par la fonction CompareTo :
if (chaine1.CompareTo(chaine2)<0) … 52
© A. Benabbou
Types référence de C#
Les chaînes de caractères
61
© A. Benabbou
Types référence de C#
Les classes
Les constructeurs
–Même syntaxe et sémantique qu’en C++ ( mais pas de constructeur de copie)
–Exécutés lors de l’instanciation de la classe :
NomClasse refobjet= new NomClasse(list_valeurs);
– Un constructeur peut appeler un autre constructeur de la même classe en utilisant
this :
NomClasse(list_parametres):this(list_valeurs){
…
}
Remarque:
Dans le code des fonctions le mot clé this peut être utilisé pour accéder aux
membres de la classe (surtout lorsque les paramètres des fonctions ont le même
nom que les attributs): this.nomMembre
62
© A. Benabbou
Types référence de C#
Les classes
Le destructeur
– Même syntaxe et sémantique qu’en C++
– Appelé automatiquement lorsque le Garbage Collector détruit une instance de la
classe
– Le destructeur appelle automatiquement les destructeurs de toutes les classes de
base de manière ascendante
class NomClasse {
~NomClasse(){
…
}
}
63
© A. Benabbou
Types référence de C#
Les classes
Les propriétés
- Une propriété permet de faciliter l’accès à des attributs privés de la classe
- Une propriété permet d’éviter l’utilisation fastidieuse de getters et setters
- Une propriété permet d’extraire ou de spécifier la valeur d'un attribut, elle encapsule
deux méthodes get et set (ou juste l’une des deux)
public type nomPropriete {
get{ ...
return nomAttribut;
}
set{ ...
nomAttribut = value;
}
}
value représente automatiquement la valeur qui sera affectée à l’attribut
Remarque : On doit utiliser évidemment un appel à une fonction qui réalise
l’affectation si le type de l’attribut ne supporte pas l’opérateur =
64
© A. Benabbou
Types référence de C#
Les classes
Exemple
class PersonneAdulte{
// attributs
private string nom;
private int age;
// propriétés
public string Nom{
get{ return nom; }
set{ nom = value; }
}
public int Age{
get{ return age; }
set{ if(value>=18) age=value;
else age = 18;}
}
public static void main(){
PersonneAdulte p = new PersonneAdulte ();
p.Nom = "Ali"; // nom "Ali";
p.Age = 30; // age 30
Console.WriteLine(p.Nom); // appel au get
}
}
65
© A. Benabbou
Types référence de C#
Les classes
–Si les méthodes get et set d'une propriété se contentent de lire et écrire
un champ privé sans aucun autre traitement, on peut utiliser une propriété
automatique déclarée par:
public Type NomPropriete{ get ; set ; }
Exemple
class PersonneAdulte{
// attributs
private int age;
// propriétés
public string Nom{get; set; }
public int Age{
get{ return age; }
set{ if(value>=18) age=value;
else age = 18;}
}
…
66
© A. Benabbou
Types référence de C#
Initialisation d’objet
C’est une simplicité du langage permettant d’initialiser un objet en utilisant ses
propriétés publiques sans créer de constructeur particulier
Syntaxe
NomClasse variable= new NomClasse {Propriete1=valeur1,
Propriete2=valeur2,… } ;
67
© A. Benabbou
Types référence de C#
Initialisation d’objet
Exemple
class Produit
{ int code;
String nom;
float prix;
public int Code{ get{ … }
set{ … }
}
…
}
69
© A. Benabbou
Les méthodes
L’indexeur
L’indexeur est défini comme une propriété de la classe
Pratiquement, c’est une surcharge de l’opérateur [], ce qui permet d’utiliser une
référence de la classe comme un tableau
Syntaxe:
class NomClasse
{ Typetab[] tableau;
public TypeTab this[int indice]
{
get { return tableau[indice]; }
set { tableau[indice] = value; }
}
}
Utilisation:
NomClasse x=new NomClasse();
x[i]=valeur;
Variable=x[i]; 70
© A. Benabbou
Les méthodes
L’indexeur
L’indice utilisé par l’indexeur peut être de n’importe quel type
On peut aussi utiliser plusieurs paramètres comme indexeurs (exemple pour les
tableaux à plusieurs dimensions)
Exemple:
class NomClasse
{ Type[][] tableau;
public Type this[int i, int j]
{
get { return tableau[i][j]; }
set { tableau[i][j] = value; }
}
}
Utilisation:
NomClasse x=new NomClasse();
x[i, j]=valeur;
Variable=x[i, j]; 71
© A. Benabbou
Les méthodes
Surcharge des opérateurs
Les opérateurs doivent être surchargés par des fonctions statiques
On peut surcharger uniquement :
–Les opérateurs arithmétiques, sauf les affectations étendues exemple += qui seront
automatiquement pris en compte
–Les opérateurs sur les bits,
–Les opérateurs de comparaison, mais par paire opposée exemple == et !=
–- Les opérateurs de conversion de type (implicitement ou explicitement)
Syntaxe:
class NomClasse
{
public static Type operator X(liste_paramètres)
{
}
© A. Benabbou
} Les paramètres seront constitués par les opérandes de l’opérateur 72
Les méthodes
Surcharge des opérateurs
Exemple :
class Complexe
{
public static Complexe operator + (Complexe a, Complexe b)
{
Complexe z=new Complexe(a.Re+b.Re,a.Im+b.Im);
return z;
}
}
Complexe z1=new Complexe(2,3),
z2=new Complexe(7,1),
z=new Complexe();
z = z1 + z2; //équivaut à : z= Complexe.operator+(z1,z2);
73
© A. Benabbou
Les méthodes
Surcharge des opérateurs
Exemple :
class Complexe
{
public static explicit operator string (Complexe a)
{
string s=a.Re+"i"+ a.Im;
return s;
}
}
Complexe z1=new Complexe(2,3),
Console.WriteLine("z1=" +(string)z1);
75
© A. Benabbou
Les méthodes
Paramètres variables
Le mot clef params doit être le dernier de la liste des paramètres formels.
Un seul mot clef params est autorisé dans la liste des paramètres formels.
Le passage ne peut s’effectuer que par valeur (ni ref ni out)
La liste de paramètres passés par params peut être vide.
76
© A. Benabbou
Les méthodes
Paramètres variables
Exemple :
static int sum( int a , int b, params int [] liste) {
int s=a+b;
for(i=0; i<liste.Length; i++)
s+=liste[i];
return s;
}
public static void Main()
{
int x=10, y=20, z=0;
z = sum( x, y, 5, 8, -6);
z = sum( x, y);
z = sum( x, y, 89,45,78,26,58,102,47);
}
77
© A. Benabbou
Les méthodes
Paramètres optionnels et nommés
Les fonctions peuvent avoir des paramètres optionnels ayant des valeurs
par défaut (type valeur uniquement)
TypeFonct NomFonction(…,Type1 param1=v1, Typek paramk=vk) {
… }
Ces paramètres peuvent être omis lors de l’appel
Exemple :
void Reset(float t[], int pos=0, float val=0){
for(int i=pos;i<t.Length;i++)
t[i]=val;
}
Lors de l’appel :
float t[]=new float[10];
Reset(t); //pos=0 et val=0
Ou:
Reset(t,0 ,-1); //pos=0 et val=-1
Ou:
Reset(t,1,-1); //pos1 et val=-1
78
© A. Benabbou
Les méthodes
Paramètres optionnels et nommés
Les paramètres nommés permettent de ne pas respecter l’ordre des
paramètres de la fonction lors de l’appel
On utilise alors le nom du paramètre et sa valeur dans l’appel à la fonction :
param:valeur
Exemple :
void Inserer(double tab[], int pos, double val){
…
}
Lors de l’appel :
double t[]=new double[10];
Inserer(t,2,3.4);
Ou:
Inserer(val:3.4, pos:2,tab:t);
Ou:
Inserer(t,val:3.4,pos:2);
79
© A. Benabbou
Types référence de C#
Les collections
L'espace de noms System.Collections contient les classes représentant les structures de
données les plus couramment utilisées : ArrayList, Queue, Stack, et Hashtable.
Exemple: une liste ArrayList
ArrayList liste = new ArrayList();
for (int i=0;i<10;i++)
liste.Add(i*3.14);
liste.RemoveAt(3);//suppression par la position
Console.WriteLine(liste.Contains(6.28));
Console.WriteLine("pos="+liste.IndexOf(6.28));
foreach (var element in liste)
Console.WriteLine(element);
for (int j = 0; j < liste.Count; j++ )
{
Console.WriteLine(liste[j]);
}
80
© A. Benabbou
Types référence de C#
Les collections
Exemples: pile, file d’attente et table de hash-codage
Stack pile = new Stack();
pile.Push(3.14); //empiler
double x = (double)pile.Pop(); //depiler
Queue file = new Queue();
file.Enqueue(3.24); //enfiler
double y = (double)file.Dequeue(); //defiler
Hashtable t = new Hashtable();
t.Add("C567845", "Benali Ali"); //ajout d’une clé et sa valeur
t.Add("D567845", "Bensaid Said");
foreach(String clé in table.Keys)
Console.WriteLine(clé);
foreach (String valeur in table.Values)
Console.WriteLine(valeur);
String personne = (String)t["D567845"]; //accès par la clé
Console.WriteLine(personne);
81
© A. Benabbou
Types référence de C#
Les génériques
Même concept que les classes « template » de C++
Ce sont des classes paramétrées par une suite de types génériques
Syntaxe de classe générique
class NomClasse<T1,T2,…..,Tk>
{
….
}
Où T1, T2 à Tk sont des identifiants de type génériques
85
© A. Benabbou
Types référence de C#
Les génériques
Exemple:
Class Pile<T> where T: class, IComparable
{
}
Donc seules les types références (classes) et qui implémentent l’interface IComparable
sont autorisés comme type concrets lors de l’instanciation
86
© A. Benabbou