
Le modificateur
Par exemple si je crée une classe qui contient une chaîne de caractères en champ, chaque instance de la classe aura sa propre version de cette chaîne de caractères.
Le mot-clef
static
se place avant le nom de la classe ou du membre qu'il affecte. Quand vous créez une classe avec des membres, vous faites un moule à objets : à partir de cette classe on fabrique ce qui s'appelle des instances de la classe.Par exemple si je crée une classe qui contient une chaîne de caractères en champ, chaque instance de la classe aura sa propre version de cette chaîne de caractères.
Le mot-clef
static
sert à faire que ce qui suit ne dépende pas d'une instance, mais dépende de la classe elle-même.
Voici un exemple :
public class Person
{
private static int s_count;
public static int Count
{
get { return s_count; }
}
public Person()
{
s_count++;
}
}
J'espère que vous reconnaissez une classe assez simple, avec un léger changement : la présence d'un champ statique
s_count
que l'on incrémente à chaque appel du constructeur. En fait j'ai fait un compteur qui indique le nombre d'objets créés. Ce compteur ne dépend pas d'une instance en particulier, mais de la classe entière.
Comment y accéder ?
Pour accéder à des champs statiques, il faut écrire :
nomDeLaClasse.nomDuChamp
. Ici, il faut écrirePerson.Count
pour accéder à s_count
qui est mis en private
.
On peut aussi utiliser ce modificateur pour une méthode :
public class Person
{
private static int s_count;
public static int Count
{
get { return s_count; }
}
public Person()
{
s_count++;
}
public static void DisplayCount()
{
Console.WriteLine(s_count + " objet(s) a(ont) été créé(s).");
}
}
Dans ce cas, vous pouvez ensuite écrire
Person.DisplayCount();
.
Améliorons cette méthode avec des
if
:
public static void DisplayCount()
{
if (s_count == 0)
{
Console.WriteLine("Aucun objet n'a été créé !");
}
else if (s_count == 1)
{
Console.WriteLine("Un seul objet a été créé.");
}
else if (s_count > 1)
{
Console.WriteLine(s_count + " objets ont été créés.");
}
else
{
Console.WriteLine("Erreur : s_count est négatif ! Il vaut : " + s_count);
}
}
Au cas où tous ces
Console.WriteLine
ne vous auraient pas fait tilt, eh oui, il s'agit bien de l'appel à la méthode statique WriteLine
de la classe Console
.
Vous pouvez créer une classe entièrement statique, dont le but n'est alors pas de servir de moule à instances. C'est d'ailleurs le cas de la classe
Console
: on ne veut pas créer d'objet de type Console
, mais faire des choses avec celle qui est ouverte. C'est aussi le cas de la classe Convert
qui sert à faire des conversions et que nous verrons sous peu. Pour faire cela il faut mettre static
devant le nom de la classe, et du coup devant chacun de ses membres :
public static class MyStaticClass
{
public static int s_myStaticInt;
public static string TellSomething()
{
return "This is all static!";
}
}
Rien de bien méchant dans celle-là non plus. Je pense que vous avez saisi l'idée.
Je vous ai dit comment utiliser la console, sans vraiment fournir d'explications. Nous allons donc à présent étudier le code qui se trouve dans une application console fraîchement créée.
Les espaces de noms
Rappels
Un espace de noms contient des classes (avec des membres : champs, méthodes, etc.) ainsi que d'autres espaces de noms.
Ici, nous avons une classe
Un espace de noms se comporte à peu près comme un dossier : il peut contenir des fichiers (ici les classes) et d'autres dossiers (les espaces de noms inclus dedans). Pour accéder au contenu d'un espace de noms, il faut mettre un point après son nom : pour accéder à la classe
Ici, nous avons une classe
Program
au sein de l'espace de noms ConsoleApplication1
(le nom de mon projet, et aussi de ma solution en l'occurrence).Un espace de noms se comporte à peu près comme un dossier : il peut contenir des fichiers (ici les classes) et d'autres dossiers (les espaces de noms inclus dedans). Pour accéder au contenu d'un espace de noms, il faut mettre un point après son nom : pour accéder à la classe
Program
, il faut ici écrireConsoleApplication1.Program
.
Le mot-clef using
Les espaces de noms peuvent "s'emboîter" à l'infinie, ce qui fait que l'écriture peut être longue :
On utilise donc le mot-clef
namespace1.namespace2.namespace3.namespace4 ...
On utilise donc le mot-clef
using
.
Les premières lignes débutent par le mot-clef
using
, sous la forme d'une directive. En écrivant using System;
vous informez Visual Studio que s'il ne trouve pas l'espace de noms ou la classe xxx
, il devra regarder s'il/elle n'est pas dans System.xxx
.using
peut aussi servir à créer un alias qui référence un espace de noms. Par exemple si nous écrivonsusing Utils = Company.Application.Utilities;
, alors nous pourrons écrire Utils.xxx
plutôt que d'écrire Company.Application.Utilities.xxx
.
D'autre part,
using
peut être utilisé sous forme de déclaration. Cela permet d'appeler automatiquement la méthode Dispose()
de l'objet spécifié. L'objet doit implémenter l'interfaceIDisposable
. Je ne veux pas plus vous embrouiller car nous n'avons pas encore vu les interfaces, donc regardez juste cet exemple :
using (System.IO.StreamReader reader = new StreamReader("readme.txt"))
{
// Lecture du fichier
}
// Le fichier est automatiquement fermé (dans la méthode Dispose de l'objet nommé reader) après le bloc.
La classe Program
Cette classe a été automatiquement créée par Visual Studio. Elle contient une seule méthode, nommée "

Main
", qui prend en entrée un tableau de chaînes de caractères et ne retourne rien (void
).static
indique que la méthode est... statique !
Un programme console s'appelle depuis la console en passant des paramètres. Ces derniers sont envoyés au programme dans le tableau
Le programme commence à s'exécuter dans la méthode
args
.Le programme commence à s'exécuter dans la méthode
Main
: c'est le point d'entrée du programme. C'est donc là que nous allons écrire notre code.
Nous n'en avons pas fini avec les classes, mais vous avez le principal : ça suffit pour le moment.