C Sharp
C Sharp
C Sharp
Monsieur RANDRIANOMENJANAHARY
Lala Ferdinand
Qu’est-ce c’est C# ?
Langage proposé par Microsoft, standardisé par ECMA
(European Computer Manufacturers
Association :Organisme européen de normalisation)
-Langage orienté objet
-Une partie évolue vers les langages de programmation
par composants
-Dérivé de C++ et de Java
-MFC (Microsoft Foundation Class:bibliothèque de classes
en C++) est remplacée par librairie .NET Framework
Combinaison entre la force de C++ et la simplicité de
Visual Basic
Cross Platform (multiplateforme)
Le langage C#
Le C# est un langage à objet procédural
Syntaxe très proche de C++ et Java
C'est un langage très fortement typé
Il est non déclaratif (pas d'en-tête)
La bibliothèque est fortement structurée
-utilisation d'espaces de nommages,
-accès via la directive « using ».
La procédure principale doit être une méthode
statique publique d'une classe
Elle doit s'appeler « Main »
Les bibliothèques utilisées doivent être
référencées dans le projet
La syntaxe peut être simplifiée avec « using »
Les entrées/sorties de base sont accessibles
via l'objet Console (espace de nommage
System)
Présentation
•Microsoft propose 4 langages
–C#, C++,VB.NET,ASP.NET
dont C# est le premier recommandé par Microsoft
Créer une application console C#
dans Visual Studio
Créer un projet
Ouvrez Visual Studio --> choisissez Créer un nouveau projet
Dans la fenêtre Créer un nouveau projet
-->Toutes les langues
--> C# dans la liste déroulante
--> Windows dans la liste Toutes les plateformes
--> Console dans la liste Tous les types de projet.
}
Les types C#
Les types fournit par C# :
–bool (booléens),
–char (caractère Unicode 16 bits),
–string (chaîne de caractères Unicode),
–types intégraux non signés (byte, ushort, uint,
ulong),
–types intégraux signés (sbyte, short, int, long),
–types flottants (float, double),
–currency (128 bits, pour les montants),
–object (type de base de tous les objets),
–void (type vide, pour les procédures).
Type Classe Description Exemple
bool System.Bool Booléen (vrai ou faux : true ou true
false)
char System.Char Caractère Unicode (16 bits) (ou 'A' 'λ' 'ω'
plus précisément, une unité de
code (code unit) Unicode
case 5:
// Traitement si i vaut 5.
goto default; // Saut à une autre étiquette.
Default:
// Traitement pour les autres cas.
break;
}
// Contrairement au C, switch fonctionne aussi avec les
chaînes.
La boucle do
do{
// Code exécuté une fois au moins, puis tant
// que la condition exprimée par la ligne while :
while (i < 7)
{
// Traitement effectué tant que i est inférieur à 7.
// Les ruptures de séquences break et continue sont
// toujours utilisables.
}
La boucle for
// Boucle classique « à la C++ ».
// Déclaration et initialisation de la variable muette,
// test de condition de boucle, opération //d'incrémentation.
// La condition est évaluée en premier (comme
// pour while) :
for (int i = 0; i < 10; ++i)
{
// Code exécuté tant que i < 10, en partant de i = 0 et
// avec incrémentation de i à chaque itération.
}
// La variable muette i n'est plus définie après la boucle.
Les itérations foreach
string[] tab = new string[5];
tab[0] = "chaîne 1";
…
tab[4] = "chaîne 5";
// Itération sur l'ensemble des données du conteneur tab :
}
}
// Traitement si non trouvé
goto fin;
trouve:
// Traitement si trouvé
fin:
Les exceptions
•La gestion des erreurs de .NET est basée sur les
exceptions
•Les exceptions doivent toutes dériver de la classe
de base System.Exception
•Les exceptions contiennent les informations sur
l'erreur et son contexte
•La syntaxe utilisée est semblable au C++
•Disponibilité d'un bloc finally pour la libération des
ressources
Les exceptions
try{
// Code exécuté sous le contrôle du try.
}
catch
{
// Récupération des exceptions.
}
finally
{
// Traitement de fin de bloc try.
// Exécuté qu'il y ait eu une exception ou non.
// Attention, n'est pas exécuté si l'exception n'est
// traitée par aucun bloc catch !
}
Les exceptions
try
{
// Lancement de l'exception :
}
// Récupération de l'exception :
catch (IO.FileNotFoundException e)
{
Console.WriteLine(e.Message);
// Relancement de l'exception :
}
catch
{
// Traitement de toutes les autres exceptions
}
-Un bloc catch peut spécifier le type d’exception à
intercepter( FileNotFoundException,
IndexOutOfRangeException,
UnauthorizedAccessException ,,,)
-La spécification de type est appelée filtre
d’exception
-Le type d’exception doit être dérivé de Exception
Les classes en C#
•Les classes sont introduites avec « class »
•Les données membres se déclarent comme des
variables
•Les méthodes comme des fonctions inline
•Plusieurs types de mode d'accès :
–private (accessibles de la classe, par défaut),
–public (accessibles de tout le monde),
–protected (accessibles des classes dérivées),
–internal (accessibles depuis l'assemblée, cf. ci-
après)
Passage d'arguments
• Par valeurs
– Appel : int a = 3; f(a);
– Description : static void f(int i) {instructions;}
• Par référence
– Appel : int a = 3; f(ref a);
– Description : static void f(ref int i)
{instructions;}
• De tableau
– Appel : int[] ta = {1,2,3}; f(ta);
– Description : static void f(int [] ti) {instructions;}
Méthodes et paramètres
•Les méthodes peuvent être surchargées
•Les paramètres sont en entrée seule par défaut :
–pour un passage par référence, utiliser « ref »,
–pour un paramètre en sortie, utiliser « out »,
–pour la valeur de retour, utiliser « return ».
•Le mode de passage des paramètres doit être
fourni à l'appel explicitement
•.NET accepte les paramètres par défaut depuis la
version 4.0
Les fonctions
-Pas de passage d'arguments par adresse
-Passage d'arguments par référence
seulement pour les tableaux et objets
-Passage d'arguments par valeur ou référence
pour les autres types
void signale une fonction qui ne retourne pas
de valeurs
Régions
Les parties du code peuvent être délimitées
dans des "régions" en les bornant par les
délimiteurs #region et #endregion
#region Test
int i = 1;
#endregion
Un bouton de réduction en forme de "-"
apparaît alors pour masquer cette partie du
code
Manipulation des objets avec
C#
utilisation des classes
Description d'une classe
Classe Personne avec deux attributs (Nom et
Prénom), un constructeur (Personne()) et une
méthode (Affiche()).
class Personne
{public string Nom;
public DateTime Naiss;
public Personne(string N, DateTime D) {Nom = N;Naiss=D;}
public void Affiche()
{MessageBox.Show(Nom);}}
Le destructeur est inutile en C #
S'il n'est pas décrit, un constructeur est implicite.
Utilisation d'un objet
// déclaration
Personne P1;
//instanciation
P1 = new Personne("Dupond",DateTime.Parse("01/01/60"));
P1.Affiche();
MessageBox.Show(P1.Naiss.ToString());
namespace write_to_a_file
{
class Program
{
static void Main(string[] args)
{
string path = "C:\\File\\file.txt";
string Text = "Hello, Hi, ByeBye";
File.WriteAllText(path, Text);
}
}
}
Ecrire des données dans un fichier
avec la classe StreamWriter
La classe StreamWriter est utilisée pour écrire des
données dans un flux dans un encodage
particulier en C#.
La méthode StreamWrite.WriteLine() permet
d’écrire une variable chaîne dans un fichier.
L’exemple de code suivant nous montre comment
écrire des données dans un fichier avec la
méthode StreamWriter.WriteLine() en C#.
using System;
using System.IO;
namespace write_to_a_file
{
class Program
{
static void Main(string[] args)
{
string path = "C:\\File\\file.txt";
string Text = "Hello and Welcome";
using (StreamWriter writetext = new StreamWriter(path))
{
writetext.WriteLine(Text);
}
}
}
}
Lire les données d’un fichier avec la
classe StreamReader
La classe StreamReader permet de lire les
données d’un flux dans un encodage particulier
en C#.
La méthode StreamReader.ReadLine() peut être
utilisée pour lire des données de chaîne à partir
d’un fichier.
L’exemple de code suivant nous montre comment
lire les données d’un fichier avec la méthode
StreamReader.ReadLine() en C#.
using System;
using System.IO;
namespace write_to_a_file
{
class Program
{
static void Main(string[] args)
{
string path = "C:\\File\\file.txt";
using (StreamReader readtext = new StreamReader(path))
{
string readText = readtext.ReadLine();
Console.WriteLine(readText);
}
}
}
}
Fonctions virtuelles
Tout objet de la classe Patient est un objet de la classe Personne.
Ainsi, la syntaxe suivante est acceptée :
Personne Pat1;
Pat1 = new Patient("Dupond",DateTime.Parse("01/01/60"),"0303");
60
XAMPP
61
62
Télécharger Connector/Net
• http://dev.mysql.com/downloads/connector/net/6.1.html
63
Création de la base de données
•use ConnectCsharpToMysql;
64
Création de la Table
66
Installez le package MySql.Data
Vous pouvez utiliser le gestionnaire de packages pour l'ajouter en tant que
package et c'est le moyen le plus simple. Vous n'avez besoin de rien d'autre
pour travailler avec une base de données MySQL. Ou vous pouvez exécuter
cette commande dans la console du gestionnaire de packages :
PM> Install-Package MySql.Data
67
using MySql.Data;
using MySql.Data.MySqlClient;
namespace Data
{
public class DBConnection
{
private DBConnection()
{
}
public string Server { get; set; }
public string DatabaseName { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
private MySqlConnection Connection { get; set;}
private static DBConnection _instance = null;
public static DBConnection Instance()
{
if (_instance == null)
_instance = new DBConnection();
return _instance;
}
public bool IsConnect()
{
if (Connection == null)
{
if (String.IsNullOrEmpty(databaseName))
return false;
string connstring =
string.Format("Server={0}; database={1}; UID={2};
password={3}", Server, DatabaseName, UserName, Password);
Connection = new
MySqlConnection(connstring);
Connection.Open();
}
return true;
}
Habituellement, Insérer, mettre à jour et supprimer sont utilisés pour écrire ou modifier des données dans la
base de données, tandis que Sélectionner est utilisé pour lire des données.
Pour cette raison, nous avons différents types de méthodes pour exécuter ces requêtes.
Les méthodes sont les suivantes :
ExecuteNonQuery : utilisé pour exécuter une commande qui ne renverra aucune donnée, par exemple
Insérer, mettre à jour ou supprimer.
ExecuteReader : utilisé pour exécuter une commande qui renverra 0 ou plusieurs enregistrements, par
exemple Select.
ExecuteScalar : utilisé pour exécuter une commande qui ne renverra qu'une seule valeur, par exemple,
Select Count(*).
71
Etapes
Commencez par Insérer, mettre à jour et supprimer, qui sont les plus simples. Le processus pour exécuter
avec succès une commande est le suivant :
1- Ouvrir la connexion à la base de données.
2- Créez une commande MySQL.
3- Affectez une connexion et une requête à la commande. Cela peut être fait à l'aide du constructeur ou à
l'aide des méthodes Connection et CommandText dans la classe MySqlCommand.
4- Exécutez la commande.
5- Fermez la connexion.
72
private void button1_Click(object sender, EventArgs e)
{
string query = "INSERT INTO tableinfo (name, age) VALUES('John Smith', '33')";
//open connection
if (this.OpenConnection() == true)
{
//create command and assign the query and connection from the constructor
MySqlCommand cmd = new MySqlCommand(query, connection);
//Execute command
cmd.ExecuteNonQuery();
//close connection
this.CloseConnection();
}
}
73
private void button2_Click(object sender, EventArgs e)
{
string query = "UPDATE tableinfo SET name='Joe', age='22' WHERE name='John Smith'";
//Open connection
if (this.OpenConnection() == true)
{
//create mysql command
MySqlCommand cmd = new MySqlCommand();
//Assign the query using CommandText
cmd.CommandText = query;
//Assign the connection using Connection
cmd.Connection = connection;
//Execute query
cmd.ExecuteNonQuery();
//close connection
this.CloseConnection();
}
74
}
private void button3_Click(object sender, EventArgs e)
{
string query = "DELETE FROM tableinfo WHERE name='John Smith'";
if (this.OpenConnection() == true)
{
MySqlCommand cmd = new MySqlCommand(query, connection);
cmd.ExecuteNonQuery();
this.CloseConnection();
}
}
75
Étapes pour select
Pour exécuter une instruction Select, nous ajoutons quelques étapes supplémentaires et nous utilisons la
méthode ExecuteReader qui renverra un objet dataReader pour lire et stocker les données ou les
enregistrements.
1- Ouvrir la connexion à la base de données.
2- Créez une commande MySQL.
3- Affectez une connexion et une requête à la commande. Cela peut être fait à l'aide du constructeur ou à
l'aide des méthodes Connection et CommandText dans la classe MySqlCommand.
4- Créez un objet MySqlDataReader pour lire les enregistrements/données sélectionnés.
5- Exécutez la commande.
6- Lisez les enregistrements et affichez-les ou stockez-les dans une liste.
7- Fermez le lecteur de données.
8- Fermez la connexion.
76
private void button4_Click(object sender, EventArgs e)
{
string query = "SELECT * FROM tableinfo";
//Open connection
if (this.OpenConnection() == true)
{
//Create Command
MySqlCommand cmd = new MySqlCommand(query,
connection);
//Create a data reader and Execute the command
MySqlDataReader dataReader = cmd.ExecuteReader();
//Read the data and store them in the list
while (dataReader.Read())
{
textbox1.text += dataReader["id"] +"" +dataReader["name"] +
""+dataReader["age"] + "\r\n";
}
//close Data Reader
dataReader.Close();
//close Connection
this.CloseConnection();
77
}
}
Extra
Parfois, une commande ne renverra toujours qu'une seule valeur, comme par exemple si nous voulons
compter le nombre d'enregistrements, nous avons utilisé Select Count(*) from tableinfo ; dans ce cas,
nous devrons utiliser la méthodeExecuteScalar qui renvoie une valeur.
Le processus pour exécuter avec succès et ExecuteScalar est le suivant :
1- Ouvrir la connexion à la base de données.
2- Créez une commande MySQL.
3- Affectez une connexion et une requête à la commande. Cela peut être fait à l'aide du constructeur ou à
l'aide des méthodes Connection et CommandText dans la classe MySqlCommand.
4- Exécutez la commande.
5- Analysez le résultat si nécessaire.
6- Fermez la connexion.
78
private void button5_Click(object sender, EventArgs e)
{
string query = "SELECT Count(*) FROM tableinfo";
int Count = -1;
//Open Connection
if (this.OpenConnection() == true)
{ //Create Mysql Command
MySqlCommand cmd = new MySqlCommand(query, connection);
//ExecuteScalar will return one value
Count = int.Parse(cmd.ExecuteScalar() + "");
//close Connection
this.CloseConnection();
MessageBox.Show(Count.ToString());
}
}
79
Programmation évènementielle avec les WinForms
Les évènements
La programmation évènementielle est fondée sur les évènements. Un
évènement représente un message envoyé à l'application. Les évènements
peuvent être d'origines diverses : action de l'utilisateur (déplacement de la
souris, clic sur un bouton, appui sur une touche du clavier, etc.) ou
évènement système (chargement d'un fichier, déclenchement d'une
minuterie, etc.).
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
Par exemple, l'ajout d'un bouton au formulaire se fait en cliquant sur le contrôle
« Button » dans la boîte à outils, puis en faisant glisser le contrôle vers le
formulaire.
Propriétés d'un contrôle
La sélection d'un contrôle (ou du formulaire lui-même) dans le concepteur
permet d'afficher ses propriétés dans une zone dédiée, située par défaut en
bas à droite de l'IDE.
Chaque contrôle dispose d'un grand nombre de propriétés qui gouvernent
son apparence et son comportement. Parmi les propriétés essentielles,
citons :
On peut aller plus loin et choisir une convention de nommage qui permet
d'identifier clairement le type du contrôle. Il n'existe pas de consensus à ce
sujet :
L'important est de rester cohérent dans la convention choisie afin que le code
soit uniforme.
Affichage de texte
Le contrôle Label est dédié à l'affichage d'un texte non modifiable.
ReadOnly permet, quand elle vaut true, d'en faire une zone en lecture seule (saisie
impossible).
Cette feature introduit une syntaxe très simple pour vérifier automatiquement
si un paramètre d'une méthode est null. Par exemple, le code suivant:
{
if (name == null)
}
Pourra être simplifié en ceci :
public string SayHello(string name!) => $"Hello {name}";
Le point d'exclamation après le nom du paramètre ajoute automatiquement
le null-check pour ce paramètre.
{
{
(X, Y).GetHashCode();
}
Les types record en C# 9 vont rendre tout ça beaucoup plus simple ! En
utilisant un type record, le code ci-dessus peut être résumé à ceci :
Eh oui, une seule ligne, et même pas bien longue ! Et cela inclut toutes les
fonctionnalités du code précédent. Sympa, non ? Il est également possible de
faire la même chose avec une structure plutôt qu'une classe, si un type valeur
est plus approprié.
Une chose à noter : les types record sont immuables, on ne peut pas modifier
les valeurs de leurs propriétés. Donc si on veut modifier une instance d'un type
record, il faut en fait en créer une nouvelle (c'est le même principe qu'avec les
dates ou les strings, par exemple). L'approche "classique" pour faire ça
ressemblerait à ceci :
Point p2 = p1 with { Y = 3 };
Il y a une petite chose qui agace les développeurs C# depuis bien longtemps :
quand on utilise l'opérateur conditionnel (aussi appelé opérateur ternaire), les
deux "branches" doivent avoir le même type, ou du moins il doit exister une
conversion de l'une vers l'autre. Si bien que le code suivant ne compile pas :
En C# 9, le code ci-dessus sera enfin valide ! Il faut juste que les deux
branches soient convertibles vers le type de destination.
Covariance du type de retour
{
}
{
}
Instructions de niveau racine
Cette feature vise à réduire le code "boilerplate" pour les programmes simples.
Actuellement, même le programme le plus simple a besoin d'une classe avec
une méthode Main :
using System;
{
{
Console.WriteLine("Hello world");
using System;
Console.WriteLine("Hello world");