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), ressemble à la syntaxe de Java
-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
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
Éléments syntaxiques
Majuscules <> minuscules (case sensitif)
Les instructions se terminent par ;
les espaces de noms dont déclarés par using
// ou /// indique que le reste de la ligne est un
commentaire
/* indique un début de commentaire
*/ indique une fin de commentaire
un identificateur doit commencer par une lettre
ou _
Premier programme
// Introduit les fonctionnalités de System :
using System;
// Classe de l'application :
class MonApp
{
// Fonction principale :
public static void Main()
{
// Équivalent de System.Console.WriteLine:
Console.WriteLine("Hello World!");
}
}
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).
Tableau à une dimension
int[] t; // référencé pas encore alloué
int[] t1, t2; // référencés pas encore alloués
t1 = new int [3]; // allocation
int[] t3 =new int[3]; //référencé et alloué
t2 = new int [] {5,3,1}; //allocation et initialisation
Console.Write(t2[0]); // affiche 5
Console.Write(t2.Length); // affiche 3
Array.Sort(t2); // tri le tableau
t2.CopyTo(t1,0); //copie t2 dans t1 depuis t2[0]
t3 = t2; // t3 et t2 référence le même tableau
t2[2] = 9; Console.Write(t3[2]); // affiche 9
Tableau à n dimensions
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
{
// Lancement de l'exception :
throw new IO.FileNotFoundException("pas trouvé");
}
// Récupération de l'exception :
catch (IO.FileNotFoundException e)
{
Console.WriteLine(e.Message);
// Relancement de l'exception :
throw;
}
catch
{
// Traitement de toutes les autres exceptions
}
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 classes en C#
•Les classes sont introduites avec « class »
•Les données membres se déclarentcomme 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)
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
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 (toujours par réf, ref implicite)
– Appel : int[] ta = {1,2,3}; f(ta);
– Description : static void f(int [] ti) {instructions;}
Code généré par C#
Références aux namespaces utilisés pour une
application Windows
Un namespace portant le nom du projet
A l'intérieur de celui-ci, une classe portant le
nom de la fenêtre principale
A l'intérieur de celle-ci, un fonction Main qui
exécute la méthode Run de l'objet Application.
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
Quelques méthodes de base
Affichage de Form2 (non modale)
Form2 f = new Form2() ; Form2.Show();
Affichage de Form2 (modale)
Form2 f = new Form2() ; Form2.ShowDialog();
Modification propriété d'un contrôle de Form2
Form2 f = new Form2() ; Form2.ShowDialog();
Affichage d'un boîte de dialogue
MessageBox.Show("Faire le choix", "Entête...",
MessageBoxButtons.YesNo);
Manipulation des objets avec
C#
Cliquez pour ajouter
utilisation un texte
des classes
Quelques principes
Il est possible avec C# de mettre en œuvre les
principes de l'objet suivant :
– surcharge de méthodes
– tableaux d'objets
– champs et méthodes statiques
– polymorphisme
– composition
– héritage (pas d'héritage multiple)
– classes abstraites
– interfaces
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 .NET
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");
Pour savoir quelle méthode appelée, C # se base sur la
définition stricte de Pat1. Ainsi Pat1 est un objet Patient, mais
Pat1.Affiche() , fait appèle à Affiche() de Personne !
Pour remédier à ce problème, il faut qualifier :
dans Personne : public virtual void Affiche();
dans Patient : public override void Affiche();
Classes abstraites
Une classe abstraite contient la définition d'une
fonction (prototype) sans son implémentation qui
sera réalisée dans une classe dérivée. Elle ne
peut pas être instanciée.
abstract class ProtoSéjour
{string No_Séjour ;
public ProtoSéjour( string Num) {No_Séjour=Num;}
public abstract void Test();}
class Séjour : ProtoSéjour
{public Séjour( string N) : base(N) {}
public override void Test(){MessageBox.Show("OK");}}
Interfaces
On peut définir uniquement les méthodes à
implémenter dans la classe
interface ObjetMétier
{void Test ();
void Affiche(string S); }
interface Serveur
{void GetVersion();}
class IDT : ObjetMétier, Serveur
{public void Test (){MessageBox.Show("OK");}
public void Affiche(string S) {MessageBox.Show(S);}
public void GetVersion() {MessageBox.Show("Version :");} }
C# MySQL
52
XAMPP
53
54
Télécharger Connector/Net
• http://dev.mysql.com/downloads/conn
ector/net/6.1.html
55
Création de la base de données
• create database
ConnectCsharpToMysql;
• use
ConnectCsharpToMysql;
56
Création de la Table
KEY(id) );
//Connexion à la base
de données
Les déclarations et initialisations des variables utiliseront:
• connection: sera utiliser pour ouvrir la connexion à la base de
données.
• server: indiquera où est hébérgé votre serveur
• database: est le nom de la base de données que nous utiliserons
• uid: nom d’utilisateur de notre MySQL.
• password: mot de passe de MySQL.
• connectionString: contient le chaîne pour connecter à la base de
données, et sera assigné à la variable de connexion.
58
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
59
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;
}
64
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
65
this.CloseConnection();
}
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();
} 66
}
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();
}
67
}
É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. 68
8- Fermez la connexion.
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();
}
}
69
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. 70
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()); // ต้อง
เพิ่ม using System.Windows;
}
}
71
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.).
Les fichiers du répertoire Properties sont gérés par Visual Studio. Ils ne
doivent pas être édités manuellement. Étudions en détail le reste de
l'arborescence.
Programme principal
Le fichier Program.cs correspond au point d'entrée dans l'application.
Voici son contenu par défaut.
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
un fichier .cs qui contient le code C# écrit par le développeur pour faire réagir
le formulaire aux évènements qui se produisent. Ce fichier est appelé code
behind.
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 :
-on peut rester générique et suffixer tous les contrôles par Ctrl ;
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).
-Items regroupe ses valeurs sous la forme d'une liste (collection) d'objets. On
peut ajouter des valeurs dans la liste déroulante dans le concepteur du
formulaire ou via le code ;
-Items regroupe ses valeurs sous la forme d'une liste (collection) d'objets. On
peut ajouter des valeurs dans la liste déroulante dans le concepteur du
formulaire ou via le code ;
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.
_ => "large"
(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");