C# (Sharp) la présentation
Par DigitalDNA le Samedi, août 9 2008, 21:12 - Développement C# - Lien permanent
A la demande de Microsoft, "Anders Hejlsberg" a mis au point un système pour
rendre le développement d'application Windows et Web beaucoup plus aisé. Une
nouvelle architecture est née suivit d'un langage qui devient aussitôt la référence
et le principal langage pour Microsoft: le C# prononcé C Sharp.
Le c# est dérivé du c++, on y retrouve aussi plusieurs caractéristiques des
langages relativement récent à savoir par exemple le java.Il participe aussi
pleinement à la création des pages Web dynamiques côté serveur et des services
Web. Puisque le c# s'inscrit dans la lignée c c++, nous allons en premier présenter
les caractéristiques de c# par rapport au c++ et en second étudier les instructions
de base de C#.
Les Caractéristiques du C# par rapport au C++
- orientation objet prononcé tout doit être incorporé dans les classes.
- code unicode nouvelle solution pour faire face à la lourdeur de l'interfaçage avec la lourdeur des modules unicodes.
- libération automatique des objets
- disparition des pointeurs
- remplacement des pointeurs par des références.
- disparition du passage d'argument par adresse au profit du passage par référence.
- nouvelles manipulations des tableaux.
- passage de tableaux en arguments
- nouvelles manières d'écrire les boucles.
- disparition de l'héritage multiple mais possibilité d'implémenter plusieurs interfaces dans une classe.
using System;
class Prog
{
static void Main()
{
Console.WriteLine("coucou");
}
}
/* A première vue, on remarque qu'il n'y a aucune directive #include, eh oui, tout est inclu dans la librairie System.La première ligne(using System) signale que l'on fera appel à des fonctions de l'architecture.NET regroupées dans un espace de noms(namespace) appelé System(attention à la casse). Parmi ces fonctions on a la classe 'Console' qui permet de dialoguer avec l'utilisateur en mode console. Différentes fonctions encore appelées méthodes peuvent être appliquées à la classe Console.Dans cet exemple on a par exemple la méthode WriteLine.On aurait pu omettre la directive using, dans ce cas on aurait écrit:
*/
class Prog
{
static void Main()
{
System.Console.WriteLine("coucou");
}
}
Utilisation d'un alias dans la clause using
using Cout = System.Console;
class Prog
{
static void Main()
{
Cout.WriteLine("coucou");
}
}
/* Ici Cout est choisi librement et n'a aucun rapport avec cout du c++ , Cout est l'alias choisi. */
| abstract | as | ||
| base | bool | break | byte |
| case | catch | char | checked |
| class | const | continue | |
| decimal | default | delegate | do |
| double | |||
| else | enum | event | explicit |
| extern | |||
| false | finally | fixed | float |
| for | foreach | ||
| goto | |||
| if | implicit | in | int |
| interface | internal | is | |
| lock | long | ||
| namespace | new | null | |
| object | operator | out | override |
| params | private | protected | public |
| readonly | ref | return | |
| sbyte | sealed | short | sizeof |
| stackalloc | static | string | struct |
| switch | |||
| this | throw | true | try |
| typeof | |||
| uint | ulong | unchecked | unsafe |
| ushort | using | ||
| vitual | void | ||
| while |
Type de données du langage c#
| entier | réel | char |
|
byte |
float |
char |
|
sbyte |
double |
|
|
byte |
decimal |
|
|
short |
||
|
ushort |
||
|
int |
||
|
uint |
||
|
long |
Par rapport au C/C++, il y a eu d'heureux changements, nettement plus simple
et plus fiable qu'en C/C++.
Les tableaux à une dimension
se déclare comme suit:
int[] tata = new int[3]; //on a déclaré et alloué un tableau de trois entiers
On peut aussi déclarer et initialiser en même temps:
t = new int[] {12, 8, 17};
spécifier la taille du tableau n'est pas nécessaire ici, car elle découle automatiquement
du nombre de valeurs initiales.
Il est possible de déclarer et de réserver un tableau à condition de l'initialiser(new
ne doit plus être écrit bien qu'il soit effectué):
int[] tata = {1, 2, 3};
float[] titi = {3.5f, 1.4f, 15.5f};
string[] fifi ={"niki", "superman", "terror"};
Les tableaux à plusieurs dimensions
int [,] tata = new int[6, 9];
tata est un tableau de 6 lignes et 9 colonnes, on aura donc 54 cellules
qui accueilleront un entier.
On peut aussi le déclaré et initialiser de la manière suivante:
int [,] tata = {{0, 1, 2}, {3, 4, 5}};
Les tableaux déchiquetés
Il est possible de créer un tableau de 2 lignes dont chaque ligne contiendrait
un nombre différent d'entiers:on parle alors de tableau déchiqueté(jagged
array):
int[][] titi; //déclaration du tableau
titi = new int[2][]; //on alloue 2 lignes
titi[0] = new int[3]; //trois entiers en première ligne.
//initialisation de la première ligne
titi[0][0] = 1;
titi[0][1] = 2;
titi[0][2] = 3;
//quatre entiers en seconde ligne(déclaration + initialisation)
titi[1] = new int[]{12, 14, 16, 18};
Ici pour accèder la troisième cellule de la première ligne c'est: titi[0][2]
LES INSTRUCTIONS DU LANGAGE C#
Bloc d'instructions
Plusieurs instructions peuvent être entourées d'accolades.Elles forment un bloc
d'instructions.Les variables déclarées dans ce bloc cesseront d'éxister à la
sortie du bloc.
N.B: toute instruction doit se trouver dans une fonction et toute fonction doit
faire partie d'une classe.
Toute variable doit être initialisée
Le compilateur C# signale une erreur de syntaxe si l'on utilise une variable
non initialisée ou si une variable pouvait ne pas être initialisée(par exemple
parce que l'assignation a été effectuée dans une branche seulement d'une alternative).
Pas d'instructions séparées par une virgule en C#
On ne peut pas écrire:
i = 1, j = 4; //ça marche en C/C++ mais erreur de syntaxe en C#
Toutes instructions doit être terminées par un point-virgule.
Conversons automatiques et castings
Les castings permettent de forcer des conversions qui ne sont pas automatiquement
réalisées par le compilateur. Parce que C# refuse les conversions qui n'ont
pas de sens comme par exemple, passer d'une représentation sous forme d'une
chaine de caractère à une représentation sous forme d'entier ou de réel,Il est
impératif d'utiliser les méthodes des classes Double, long, Single ou Integer.
LES OPÉRATIONS D'ENTRÉE/SORTIE (E/S)
Lecture de données saisies au clavier
La lecture des données se fait par la fonction ReadLine(attention à la casse)une
fonction statique de la classe Console.Illustrons cette fonction:
using System;
string t = Console.ReadLine();
int i = Int32.Parse(t);
Attention! les données entrées doivent être de type entier.
autre exemple:
string t = Console.ReadLine();
float v = float.Parse(t);
Lecture fiable d'un entier
int i;
...
try
{
string titi = Console.ReadLine();
i = Int32.Parse(titi);
Console.WriteLine("données saisies: + i);
}
catch (Exception e)
{
Console.WriteLine("Erreur sur le nombre");
}
| instructions; | affichage |
| using System; | |
|
Console.WriteLine("Bon"); |
Bon jour |
|
Console.Write("sa"); |
salut |
|
int i=4; |
4 |
|
int i=4; |
valeur i: 4 |
|
int i=4; int j=5; |
i = 4 et j = 5 |
|
int i=12; int j=3; |
i = 12 et j = 3 |
|
int i=12; int j=3; |
15 |
|
int i=12; int j=3; |
123 |
|
int i=12; int j=3; |
15 |
|
int i=12; int j=3; |
15 |
|
int i=12; int j=3; |
36 |
|
int i=12; int j=3; |
15 somme = |
L'instruction if
Rien de nouveau par rapport au C/C++. Tout se déroule suivant la logique de
n'importe quel langage moderne. Pour ne pas présenter les choses connues, nous
allons juste noter quelques petites différences.
| instructions légales en C/C++ | écriture en C#: |
| if (i) | if (i != 0) |
| if (!i) | if (i == 0) |
|
if (i = j) |
i = j; |
L'instruction foreach
L'instruction foreach permet de parcourir un tableau ainsi qu'une collection
string[] toto = new int[] {60, 18, 45, 5};
foreach (int i in toto) Console.WriteLine(i);
Dans le cas d'un tableau de chaîne de caractères:
string[] tab = {"niki", "terminator", "rambo"};
foreach (string s in tab) Console.Writeline(s);
Se lit: pour chaque cellules du tableau tab, il faut exécuter l'instruction
Console.WriteLine.
On peut aussi spécifier plusieurs instructions, il faudra alors penser à les
entourer d'accolades comme pour les autres boucles.
L'instruction for
| for (int i=0; i<10; i++)... | pareil qu'en c/c++ |
| for (int i=0, j=10; i++, j--) | jusque là pas de problème |
|
int i=0; int j=10; |
les variables i et j sont déclarées en dehors de la boucle et ne sont donc plus limitées à la boucle |
| for (;;i++, j--)... |
l'initialisation et la condition sont absentes, donc la condition est toujours vraie; utiliser l'instruction break pour sortir de la boucle |
| for (;;) {...; i++; i--} | |
| for (; true;) {...; i++; i--} | pareil que le précédent |
Exemple de boucle for:
int[] tata = {56, 7, 31};
for (int i=0; i< tata.Length; i++)Console.WriteLine(tata[i]);
Les instructions goto, switch, break et continue
Pareil quand C/C++, mais nous devons faire attention car C# modifie
le passage d'un case à l'autre(sauf dans le cas où case ne comporte aucune instruction)
et accepte les chaînes de caractères dans le sélecteur. Si une clause case comporte
au moins une instruction, le passage aux cases suivantes n'est possible qu'en exécutant
goto case.Illustrons par un exemple:
ici var est de type entier
switch (var)
{
case 0 : une ou plusieurs instructions;
break;
case 1 :
case 2 : une ou plusieurs instructions;
break;
case 3 : une ou plusieurs instructions;
goto case 4;
case 4 : une ou plusieurs instructions;
break;
default : une ou plusieurs instructions;
}
- toutes les fonctions sont dépendantes d'une classe.
- différence en ce qui concerne le passage d'argument par référence.
- pas de différence en ce qui concerne le passage d'argument par valeur.
- plus de passage d'argument par adresse.
- pas de prototype ni de fichier à inclure.
- facilité d'acceptation de tableau.
- peut renvoyer un tableau.
Exemple de passage d'un tableau en argument:
class Prog {
static void Main()
{
int[] tab = {12, 13, 14, 15);
f(tab);
foreach (int i in tab) Console.WriteLine(i);
}
static void f(int [] titi)
{
for (int i=0; i < titi.Length; i++) titi[i]++ ;
}
}
Exemple de passage d'arguments par valeur
using System;
class Prog
{
static void Main()
{
int a=6, b;
f(a); //appel de la fonction f avec le contenu de a en argument
b = g(a, 3); //b prend la valeur 18
}
static void f(int i)
{
Console.WriteLine(i); //affiche 6
}
static int g(int a1, int a2)
{
return a1*a2;
}
}
Passage d'argument par référence
class Prog
{
static void Main()
{
int a=6;
f(ref a); //passer a de Main en argument
Console.WriteLine("{0}", a); //affiche 13
static void f(ref int a1)
{
a1 = 13; //modifie a de Main
}
}