Les mots clés de C#
Date de publication : 20/03/2007 , Date de mise à jour : 26/03/2007
Par
Jérôme Lambert (Mes articles)
Suite à l'article "Les mots réservés du langage Java" de Baptiste Wicht, il était temps de faire de même.
Au travers de cet article, vous découvrirez ce qu'est un mot clé avec une présentation de chacun des 77 mots clés du langage C#.
I. Introduction
Tout d'abord, un mot clé (ou keyword an anglais) est un mot réservé qui a une signification particulière pour le compilateur. Les mots clés ne pourront donc pas être utilisés pour identifier les variables, classes ou encore les fonctions.
Au cours de cet article, l'ensemble des mots clés de C# vous seront présentés. Vous verrez aussi comment les utiliser pour identifier des variables, méthodes voir classes contrairement à ce qui a été dit précédemment.
II. Des mots pas si réservés que ça...
Bien que déconseillé, il vous est tout à fait possible d'utiliser les mots clés pour identifier les variables, classes et autres.
II-A. Première technique - sensibilité à la casse
C# étant sensible à la casse, vous pouvez donc utiliser un mot clé en modifiant sa casse d'origine :
void While()
{
int iF = 0;
}
|
II-B. Seconde technique - préfixe @
La seconde technique permet d'utiliser un mot clé en le préfixant de @ :
void @while()
{
int @if = 0;
}
|
III. Liste des mots clés
Voici la liste des mots clés qui seront détaillés par la suite :
IV. Description des mots clés
abstract
abstract est utilisé avec les classes, méthodes, propriétés, indexeurs et évènements. En utilisant abstract dans la déclaration d'une classe, cela signifiera que cette classe est une classe de base qui ne pourra pas être instanciée directement. Pour ce qui est des membres marqués comme abstraits ou contenus dans une classe abstraite, ils devront être implémentés dans la classe qui dérive de la classe abstraite.
abstract public class Animal
{
abstract public string Cri();
}
public class Chien : Animal
{
public override string Cri()
{
return "Waf !!!";
}
}
static void Main()
{
Chien monChient = new Chien();
}
|
as
as permet de vérifier qu'un objet est bien d'un certain de type. Si la condition est vérifiée un casting implicite est effectué pour récupérer l'objet sous le bon type, dans le cas contraire, null sera renvoyé.
abstract public class Animal
{
abstract public string Cri();
}
public class Chien : Animal
{
public override string Cri()
{
return "Waf !!!";
}
}
public class Chat : Animal
{
public override string Cri()
{
return "Miaouuu !!!";
}
}
static void Main()
{
Object[] mesAnimaux = { new Chien(), new Chat() };
foreach (Object AnimalCourant in mesAnimaux)
{
Chien monChien = AnimalCourant as Chien;
Chat monchat = AnimalCourant as Chat;
if (monChien != null)
Console.WriteLine("Voici le cri du chien : {0}", monChien.Cri());
else if (monchat != null)
Console.WriteLine("Voici le cri du chat : {0}", monchat.Cri());
else
Console.WriteLine("Animal inconnu !");
}
}
|
base
base permet d'accéder depuis une classe dérivée à la classe de base.
public class Chien : Animal
{
public override string Cri()
{
return "Waf !!!";
}
}
public class Labrador : Chien
{
public string CriLabrador()
{
return base.Cri();
}
}
|
bool
bool est un alias de la structure System.Boolean. Vous pourrez donc aussi bien utiliser bool que Boolean pour déclarer une variable booléenne.
bool monBoolAlias = true;
Boolean monBooleanStructure = monBoolAlias;
|
break
break permet de sortir d'une boucle ou d'un switch.
| Cas de la boucle |
for (int i = 0; i < 5; i++)
{
if (i == 2)
{
Console.WriteLine("On peut quitter la boucle !");
break;
}
}
|
| Cas du switch |
Console.WriteLine("Voulez-vous quitter ? [O pour oui - N pour non]");
string ret = Console.ReadLine();
switch (ret.ToUpper()[0])
{
case 'O':
Console.WriteLine("Au revoir");
break;
case 'N':
Console.WriteLine("On continue alors...");
break;
default:
Console.WriteLine("Commande inconnue !");
break;
}
|
byte
byte est un alias de la structure System.Byte. Vous pourrez y stocker une valeur entière non signée codée sur 8 bits (de 0 à 255).
byte monByteAlias = 5;
Byte = monByteStructure = monByteAlias;
|
case
case représente un des aiguillages de l'instruction switch.
Console.WriteLine("Voulez-vous quitter ? [O pour oui - N pour non]");
string ret = Console.ReadLine();
switch (ret.ToUpper()[0])
{
case 'O':
Console.WriteLine("Au revoir");
break;
case 'N':
Console.WriteLine("On continue alors...");
break;
default:
Console.WriteLine("Commande inconnue !");
break;
}
|
catch
catch permet de traiter une exception qui a été levée dans le bloc try précédent. Si les instructions dans le bloc try peuvent lever plusieurs exceptions différentes, il est possible de les intercepter en faisant suivre le bloc try par plusieurs bloc catch.
try
{
int i = 0;
int j = 5;
int ret = j / i;
}
catch (DivideByZeroException exc)
{
Console.WriteLine("Voici le message de l'erreur : {0}", exc.Message);
}
|
Remarque : Si vous désirez intercepter n'importe quelle exception dans un unique bloc catch, il vous suffit d'intercepter l'exception Exception qui est la classe de base de toute exception.
char
char est un alias de la structure System.Char. Il vous permet de déclarer un caractère unicode.
char monCharAlias = 'A';
Char monCharStructure = monCharAlias;
|
checked
Par défaut, C# ne signale aucune erreur en cas de dépassement de capacité sur des entiers. La valeur résultante sera donc erronée dans un tel cas. checked permet de générer une exception en cas de dépassement de capacité lors d'opérations arithmétiques, conversions ou encore division par 0.
int i = 0;
int j = 1;
i = Int32.MaxValue + j;
try
{
int k = 0;
int l = 1;
k = checked(Int32.MaxValue + l);
}
catch (Exception)
{
Console.WriteLine("Dépassement de capacité !");
}
|
class
class, comme son l'indique, permet de déclarer une classe.
const
const permet de déclarer une variable en tant que constante. L'initialisation devra se faire en même temps que la déclaration car il ne sera plus possible de modifier la valeur de la variable par après.
const int maConstante = 2007;
|
continue
continue va de paire avec break. continue permet de passer à l'itération suivante dans une boucle contrairement à break qui permet de sortir de la boucle.
for (int i = 0; i < 5; i++)
{
if (i == 1)
{
continue;
}
Console.WriteLine("Numéro de l'itération : {0}", i);
}
|
decimal
decimal est un alias de la structure System.Decimal. Ce type permet d'avoir une plus grande précision que le type float. On peut y stocker une valeur de type flottante codée sur 128 bits (environ 8*10^28).
decimal monDecimalAlias = 9.1m;
Decimal monDecimalStructure = monDecimalAlias;
|
default
default a 2 significations :
Dans un bloc switch, default représente le bloc par défaut lorsque aucun aiguillage ne correspond.
switch (3)
{
case 1: Console.WriteLine("Valeur 1"); break;
case 2: Console.WriteLine("Valeur 2"); break;
default: Console.WriteLine("Valeur par defaut"); break;
}
|
Sa seconde utilité est de pouvoir récupérer la valeur par défaut d'un type valeur ou référence. On y trouve une utilité lors de l'utilisation de générique où on sait déterminer si on a affaire à un type valeur ou référence.
public class MaClasse<T>
{
public MaClasse(T param)
{
Object obj = default(T);
if (obj == null)
Console.WriteLine("T est un type référence !");
else
Console.WriteLine("T est un type valeur !");
}
}
static void Main()
{
MaClasse<int> test1 = new MaClasse<int>(5);
MaClasse<string> test2 = new MaClasse<string>("Salut");
}
|
delegate
delegate permet de déclarer un type référence qui permettra d'encapsuler plusieurs méthodes nommées ou anonymes.
delegate void D();
static void MethodA()
{
Console.WriteLine("Méthode A");
}
static void MethodB()
{
Console.WriteLine("Méthode B");
}
static void Main()
{
D monDelegue = new D(MethodA);
monDelegue();
monDelegue += new D(MethodB);
monDelegue();
monDelegue -= new D(MethodA);
monDelegue();
D monDelegueAnonyme = delegate { Console.WriteLine("Ceci est une méthode anonyme !"); };
monDelegueAnonyme();
}
|
do
do permet d'exécuter en boucle un bloc d'instructions tant que la condition renvoie vrai. A noter que la condition ne sera vérifiée qu'après avoir exécuté une première fois le bloc d'instruction.
static void Main()
{
int i = 0;
do
{
i++;
} while (i < 5);
}
|
double
double est un alias de la structure System.Double. Vous pourrez stocker dans ce type une valeur à virgule flottante codée sur 64 bits (de 4.9*10^-324 à 1.8*10^308).
double monDoubleAlias = 13.7;
Double = monDoubleStructure = monDoubleAlias;
|
else
else va de paire avec if. Si la condition du if n'est pas vérifiée, on passera au bloc else.
Boolean valeur = true;
if (valeur == true)
{
Console.WriteLine("La condition est vraie");
}
else
{
Console.WriteLine("La condition est fausse");
}
|
enum
enum permet de déclarer une énumération qui représente un ensemble fini de constantes nommées.
enum Jours
{
Lundi,
Mardi,
Mercredi,
Jeudi,
Vendredi,
Samedi,
Dimanche
}
|
event
event permet de déclarer un évènement. Les évènements permettent de notifier des occurrences qu'un état donné a été modifié (clique sur un bouton par exemple).
delegate void TimeEventHandler();
class TestTime
{
public event TimeEventHandler OnTime;
public void time()
{
OnTime();
}
}
static class Program
{
static void Main()
{
TestTime monTime = new TestTime();
monTime.OnTime += new TimeEventHandler(monTime_OnTime);
monTime.time();
}
<summary>
</summary>
static void monTime_OnTime()
{
MessageBox.Show("Evènement !");
}
}
|
explicit
explicit permet de déclarer un opérateur explicite de conversion.
public class Franc
{
public Double Argent;
public Franc(Double param_Argent)
{
Argent = param_Argent;
}
}
public class Euro
{
public Double Argent;
public Euro(Double param_Argent)
{
Argent = param_Argent;
}
public static explicit operator Euro(Franc param_Franc)
{
return new Euro(param_Franc.Argent / 6.55957);
}
}
static class Program
{
static void Main()
{
Franc mesFranc = new Franc(1000);
Euro ConversionEuro = (Euro)mesFranc;
Console.WriteLine("{0} FF = {1} €", mesFranc.Argent, ConversionEuro.Argent);
}
}
|
extern
extern permet de déclarer une méthode comme étant implémentée en externe. C'est-à-dire dans une DLL non managée. extern sera le plus souvent utilisé avec l'attribut DllImport.
static class Program
{
<summary>
</summary>
[DllImport("User32.dll")]
public static extern int MessageBox(int h, string m, string c, int type);
static void Main()
{
MessageBox(0, "Mon texte", "Mon titre", 0);
}
}
|
false
false est un opérateur représentant la valeur faux d'un bool (ou Boolean).
finally
finally est le troisième bloc possible avec un try/catch. Il sera toujours exécuté peu importe ce qu'il arrive : en quittant le bloc try (normalement ou avec return) ou après le bloc catch suite à une exception.
Le bloc finally est la plupart du temps (pour ne pas dire tout le temps) utilisé pour libérer les ressources allouées dans le bloc try.
static void Main()
{
ArrayList monTableau = new ArrayList();
monTableau.Add("5");
monTableau.Add("9");
monTableau.Add("s");
try
{
for (int i = 0; i < monTableau.Count; i++)
{
int monInt = Convert.ToInt32(monTableau[i]);
}
}
catch (Exception)
{
Console.WriteLine("Il y a eu une exception !");
}
finally
{
monTableau = null;
}
}
|
fixed
fixed est utilisé dans les contexte unsafe, c'est à dire avec utilisation de pointeurs. Dotnet peut à tout moment modifier l'emplacement en mémoire de telle ou telle autre variable ce qui pourrait poser problème si on désire parcourir un tableau à partir de l'adresse de la première cellule. fixed va permettre d'empêcher que le Garbage Collector déplace la variable dans la mémoire.
static class Program
{
unsafe static void Main()
{
int[] tab = new int[2007];
fixed (int* p = tab)
{
Random random = new Random();
for (int i = 0; i < tab.Length; i++)
p[i] = random.Next();
}
}
}
|
float
float est un alias de la structure System.Single. Vous pourrez stocker dans ce type une valeur à virgule flottante codée sur 32 bits (de 1.4*10^-45 à 3.4*10^38).
float monFloatAlias = 13.7F;
Single monSingleStructure = monFloatAlias;
|
for
for permet de répéter une instruction ou un bloc d'instructions tant que l'expression évaluée renvoie vrai.
for (int i = 0; i < 10; i++)
{
Console.WriteLine("{0}", i);
}
|
La boucle for ci-dessus se déroule comme suit :
i est initialisé à 0 ;
i est évalué : si i est bien inférieure à 10, on exécute le bloc d'instructions ;
Une fois le bloc exécuté, i est incrémenté de 1 ;
Pour être une nouvelle fois évalué ;
Cette séquence se répètera tant que i sera strictement inférieure à 10
foreach
foreach permet de parcourir une collection afin de récupérer un par un chaque élément afin d'exécuter un bloc d'instructions.
string[] stringTab = { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" };
foreach (string str in stringTab)
{
Console.WriteLine("{0}", str);
}
|
goto
goto permet de sauter à une instruction étiquetée. Cette pratique est vivement déconseillée car on peut très vite se retrouver avec un code dont il est difficile de savoir ce qui sera exécuté sous telle ou telle autre condition. On appelle ça la " programmation spaghetti ".
static class Program
{
static void Main()
{
int i = (new Random()).Next();
if (i % 2 == 0)
goto Pair;
else
goto Impair;
Pair:
Console.WriteLine("i est un nombre pair ({0})", i);
return;
Impair:
Console.WriteLine("i est un nombre impair ({0})", i);
return;
}
}
|
if
if permet de tester une ou plusieurs condition afin d'exécuter un bloc d'instructions dans le cas où la condition est vrai. En cas de condition qui renvoie faux, on passera au test de la condition du bloc suivant (else if) ou au bloc par défaut (else) s'il y en a un.
int i = 0;
if (i == 0)
{
Console.WriteLine("i vaut {0}", i);
}
else if (i == 1)
{
Console.WriteLine("i vaut {0}", i);
}
else
{
Console.WriteLine("i ne vaut ni 0, ni 1");
}
|
implicit
implicit est utilisé pour déclarer un opérateur de conversion implicite défini dans une classe.
class NombreEntier
{
public int valeur;
public NombreEntier(int param)
{
valeur = param;
}
public static implicit operator int(NombreEntier a)
{
return a.valeur;
}
}
static class Program
{
static void Main()
{
NombreEntier monNombre1 = new NombreEntier(5);
int monInt = (int)monNombre1;
Console.WriteLine("monInt vaut {0}", monInt);
}
}
|
in
in fonctionne avec le mot clé foreach qui permet de parcourir une collection. in est utilisé pour spécifier la collection dans laquelle il faudra récupérer chaque élément.
string[] stringTab = { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" };
foreach (string str in stringTab)
{
Console.WriteLine("{0}", str);
}
|
int
int est un alias de la structure System.Int32. Vous pourrez stocker dans ce type une valeur entière signée codée sur 32 bits (de -2^31 à 2^31 - 1).
int monIntAlias = 2007;
Int32 monInt32Structure = monIntAlias;
|