vendredi 28 mars 2014

4 - Les variables

0 commentaires
Comme son nom l'indique, une variable est quelque chose qui varie. Sa représentation la plus courante est une boîte qui contient des informations.
Les deux éléments essentiels d'une variable sont sa valeur (et donc son type) et son nom. Nous parlerons des types juste après.
Le nom, c'est vous qui le fixez ; il est unique et permet de n'identifier qu'une seule variable. La valeur, quant à elle, peut être à peu près n'importe quoi, et peut être modifiée autant que l'on veut. Pour schématiser, la variable est la boîte, son nom est écrit dessus, sa valeur est ce qu'elle contient, et son type est la forme de la boîte.

Donner un nom à ses variables

En C#,
  • le nom d'une variable est obligatoirement écrit avec des caractères alphanumériques (de préférence sans accent), ainsi que le underscore '_' (sans les apostrophes) : abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789 ;
  • le nom doit forcément commencer par une lettre (underscore '_' compris) ;
  • le nom ne doit pas être le nom d'un type ou d'une classe déjà définis, d'un mot-clef du langage, ...(il ne doit pas être déjà pris). Bref, il ne faut pas que la confusion soit possible.

Types de variables de base

En C#, les variables possèdent un type qui précise la nature des informations stockées.
L'inconvénient que remarquent surtout ceux qui ont l'habitude d'un langage sans typage (tel que le PHP) est le manque de "souplesse" : certaines choses peuvent être écrites plus simplement dans ce langage qu'en C#. Par exemple, le chiffre 2 et sa représentation en caractère '2' peuvent éventuellement être utilisés l'un à la place de l'autre, ce qui n'est pas le cas en C#.
L'avantage est que vous savez exactement ce que vous manipulez. Cela permet d'éviter certaines erreurs, de bien comprendre ce que votre code fait, et de pouvoir l'optimiser.
C'est une habitude à prendre ; ensuite vous redouterez le "laxisme" de certains langages !
Le C# dispose de types de base qui permettent de représenter des informations dont la nature est courante, comme des nombres, des caractères et des chaînes de caractères. Il existe un nombre infini de types étant donné que l'on peut construire un nouveau type à partir de ceux qui existent déjà. C'est ce que nous verrons quand nous étudierons les classes.
Voici un tableau exhaustif contenant les types de base du C# :
Type C#
Type .NET
Signification
Taille en mémoire (en octets)
Domaine de valeurs
char
Char
character (caractère)
2
caractère Unicode (UTF-16) allant de U+0000 à U+ffff
string
String
chaîne de caractères
variable
référence sur une séquence de caractères Unicode
int
Int32
integer (nombre entier)
4
[-231; 231-1]
uint
UInt32
unsigned integer (nombre entier non signé)
4
[0; 232-1]
long
Int64
nombre entier long
8
[-263; 263-1]
ulong
UInt64
unsigned long (nombre entier long non signé)
8
[0; 264-1]
sbyte
SByte
signed byte (octet signé)
1
[-27; 27-1]
byte
Byte
octet
1
[0; 28-1]
short
Int16
nombre entier court
2
[-215; 215-1]
ushort
UInt16
unsigned short (nombre entier court non signé)
2
[0; 216-1]
float
Single
flottant (nombre réel)
4
±1,5*10-45 à ±3,4*10+38 (7 chiffres de précision)
double
Double
double flottant (nombre réel)
8
±5,0*10-324 à ±1,7*10+308 (15 à 16 chiffres de précision)
decimal
Decimal
nombre décimal
16
±1,0*10-28 à ±7,9*1028 (28 à 29 chiffres significatifs)
bool
Boolean
booléen
1
true / false
object
Object
référence d'objet
variable
référence d'objet
Chacun des types C# présentés est un alias du type .NET associé, cela signifie que lorsque que vous écrivez par exemple int, c'est comme si vous aviez écrit System.Int32. Pour raccourcir et par habitude, on privilégie le type C# au type .NET.

Illustration avec sizeof et typeof

sizeof permet de connaître la taille (en octets) occupée en mémoire par une variable de type valeur. Nous verrons très bientôt ce que cela veut dire ; pour faire simple, il faut que la taille soit fixe. Par exemple, on ne peut pas écrire sizeof(string), car une chaîne de caractères peut être de la taille que l'on veut. D'autre part, multiplier le nombre de caractères par la taille d'un seul caractère ne suffit pas non-plus ; en effet l'objet string contient en mémoire plus d'informations qu'une simple chaîne de caractères (cf. ce site).
typeof permet de connaître le type d'une variable.
Par exemple, le code suivant...
1int i = 10;
2string s = "Hello world!";
3char c = 'a';
4
5Console.WriteLine("i est de type " + typeof(int) + " et occupe " + sizeof(int) + " octet(s) en mémoire.");
6Console.WriteLine("s est de type " + typeof(string) + ".");
7Console.WriteLine("c est de type " + typeof(char) + " et occupe " + sizeof(char) + " octet(s) en mémoire.");
...affichera :
i est de type System.Int32 et occupe 4 octet(s) en mémoire.
s est de type System.String.
c est de type System.Char et occupe 2 octet(s) en mémoire.

Conventions d'écriture pour le typage des données écrites "en dur" dans le code

Dans votre code, vous pouvez directement entrer des valeurs à affecter aux variables. La question qui se pose est : de quel type sont les données entrées ? En effet, par exemple le chiffre 2 doit-il être compris comme un int, un uint, un double, ... ? Pour pallier à ce problème, des conventions ont été établies.
Un nombre entier est considéré comme un int s'il tient dans la plage de valeurs d'un int (exemple :-123), et comme un long s'il ne tient pas dans la plage de valeurs d'un int mais dans celle d'un long(exemple : 5111222333).
Un nombre écrit avec un u à la fin symbolise un uint. Exemple : 2u (ou 2U).
Un nombre écrit avec un l à la fin symbolise un long. Exemple : 2l (ou 2L).
Un nombre écrit avec ul à la fin symbolise un ulong. Exemple : 2ul (ou 2UL).
Un nombre écrit avec une partie décimale, ou avec un d à la fin symbolise un double. Exemple : 2.0 ou2d (ou 2D).
Un nombre écrit avec un f à la fin symbolise un float. Exemple : 2.0f ou 2f (ou 2F).
Un nombre écrit avec un m à la fin symbolise un decimal. Exemple : 2.0m ou 2m (ou 2M).
D'autre part, les guillemets (") servent à encadrer une chaîne de caractères et les apostrophes (') servent à encadrer un caractère.
Exemple : "Bonjour tout le monde" et 'B'.

Déclaration

Pour utiliser une variable, il faut d'abord la déclarer (la créer) : on réserve une partie de la mémoire pour cette variable. On spécifie ce qu'elle représentera (un entier, un caractère, une image, ...) en indiquant son type.
La syntaxe est : type nom;

Valeur par défaut

Une fois que cette ligne est exécutée, de la place est allouée en mémoire pour stocker une valeur.
Par exemple, le code suivant causera une erreur :
1static void Main(string[] args)
2{
3    int myInt;
4    Console.WriteLine(myInt);
5}
Le compilateur vous dit "Use of unassigned local variable 'myInt'". En fait, le compilateur crie parce qu'il ne sait pas ce que doit valoir notre entier. Il faut donc que vous lui donniez une valeur, par exemple :
1static void Main(string[] args)
2{
3    int myInt = 255;
4    Console.WriteLine(myInt);
5}
Comme je vous le disais, vous n'êtes pas toujours contraints à spécifier de valeur : dans certains cas, c'est la valeur par défaut qui est automatiquement utilisée. Nous étudierons cela dans le chapitre sur les classes, mais ça ne fait pas de mal d'apprendre dès maintenant les valeurs par défaut :
  • la valeur par défaut de tout type numérique est 0, adapté au type (0.0 pour un float ou undouble) ;
  • la valeur par défaut d'une chaîne de caractères (string) est null, et non pas la chaîne vide, qui est représentée par string.Empty ou encore "" ;
  • la valeur par défaut d'un caractère (char) est '\0'.

Attribuer une valeur

Voici comment créer un entier nommé myInteger et ayant la valeur 3 :
1int myInteger;
2myInteger = 3;
Pour raccourcir, écrivez : int myInteger = 3;.
Cela revient exactement au même : on rassemble la déclaration et l'initialisation. Vous conviendrez que c'est mieux car c'est plus concis.
Voici comment créer une chaîne de caractères valant "Hello world!" et un caractère ("char" signifie "caractère" en anglais) valant 'a' :
1string myString = "Hello world!";
2char myChar = 'a';

Leave a Reply