Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Black Friday: -25€ dès 75€ sur les livres en ligne, vidéos... avec le code BWEEK25. J'en profite !

Les bases du langage

Introduction

Comme tous les langages de programmation, C# impose certaines règles au développeur. Ces règles se manifestent au travers de la syntaxe du langage mais elles couvrent le large spectre fonctionnel proposé par C#. Avant d’explorer en profondeur les fonctionnalités du langage au chapitre suivant, nous étudierons donc les notions essentielles et fondamentales de C# : la création de données utilisables par une application et le traitement de ces données. 

Les variables

Les données utilisables dans un programme C# sont représentées par des variables. Une variable est un espace mémoire réservé auquel on assigne arbitrairement un nom et dont le contenu est une valeur dont le type est fixé. On peut manipuler ce contenu dans le code en utilisant le nom de la variable.

1. Nommage des variables

La spécification du langage C# établit quelques règles à prendre en compte lorsque l’on nomme une variable :

  • Le nom d’une variable ne peut comporter que des chiffres, des caractères de l’alphabet latin accentués ou non, le caractère ç ou les caractères spéciaux _ et µ.

  • Le nom d’une variable ne peut en aucun cas commencer par un chiffre. Il peut en revanche en comporter un ou plusieurs à toute autre position.

  • Le langage est sensible à la casse, c’est-à-dire qu’il fait la distinction entre majuscules et minuscules : les variables unevariable et uneVariable sont donc différentes.

  • La longueur d’un nom de variable est virtuellement illimitée : le compilateur ne remonte pas d’erreur lorsqu’il est composé de 30 000 caractères ! Il n’est évidemment pas recommandé d’avoir des noms de variables aussi longs, le maximum en pratique étant plus souvent de l’ordre de la trentaine de caractères.

  • Le nom d’une variable ne peut pas être un mot-clé du langage. Il est toutefois possible de préfixer un mot-clé par un caractère autorisé ou par le caractère @ pour utiliser un nom de variable similaire.

Les noms de variables suivants sont acceptés par le compilateur C# :

  • maVariable

  • maVariableNumero1

  • @void (void est un mot-clé de C#)

  • µn3_VàRïãbl3

De manière générale, il est préférable d’utiliser des noms de variables explicites, c’est-à-dire permettant de savoir à quoi correspond la valeur stockée dans la variable, comme nomClient, montantAchat ou ageDuCapitaine.

2. Type des variables

Une des caractéristiques de C# est la notion de typage statique : chaque variable correspond à un type de données et ne peut en changer. De plus, ce type doit être déterminable au moment de la compilation....

Les constantes

Lors de l’écriture d’une application, il arrive que l’on utilise des valeurs déterminées qui ne sont pas amenées à être modifiées. Un exemple typique est la constante mathématique π. Cette valeur est définie comme suit dans la classe Math du framework .NET :

public const double PI = 3.14159; 

Cette instruction est une déclaration de variable à laquelle on a ajouté le mot-clé const. L’utilisation de ce mot-clé permet de sceller la valeur de PI.

Il est possible de définir des constantes calculées à partir d’autres constantes :

public const double 2PI = 2 * Math.PI; 

Les opérateurs

Les opérateurs sont des mots-clés du langage permettant l’exécution de traitements sur des variables, valeurs de retour de fonctions ou valeurs littérales (les opérandes).

La combinaison d’un opérateur et d’un ou plusieurs opérandes constitue une expression qui sera évaluée à l’exécution et retournera un résultat dépendant des différents éléments qui la composent.

Nous avons déjà vu l’opérateur d’affectation = qui permet d’assigner une valeur à une variable. Celle-ci peut être une variable, une valeur littérale, le résultat d’une fonction ou le résultat d’une expression.

Les différents autres opérateurs peuvent être classés en six familles relatives au type de traitement qu’ils permettent d’effectuer.

1. Les opérateurs d’accès

Le langage C# définit plusieurs modes d’accès aux données des objets qu’il permet de manipuler. Chacun de ces modes utilise un opérateur particulier.

a. Accès simple : .

C# utilise le symbole . (point) pour permettre l’accès aux membres d’un objet, ou éventuellement d’un type.

//Ici, on utilise l'opérateur . pour accéder  
//au membre "Nom" de la variable "personne"  
 
string nomEleve = personne.Nom;  

b. Accès indexé : [ ]

L’opérateur d’accès indexé offre la possibilité d’accéder à une valeur contenue dans une variable en fournissant un index. L’utilisation de variables de type tableau implique généralement l’utilisation de cet opérateur pour la lecture ou la modification des données qu’il contient.

Élément unique

Pour accéder à un élément particulier du tableau, l’index doit être une valeur entière représentant la position de l’élément au sein du tableau. Attention, en C#, le premier élément d’un tableau a toujours l’index 0.

int[] tableau = new int[10]; 
tableau[0] = 123 ; 

Sous-ensembles d’éléments

À partir...

Les structures de contrôle

Les structures de contrôle permettent de créer un flux de traitements complexe. Il existe deux types de structures de contrôle :

  • Les structures conditionnelles, qui exécutent un traitement en fonction d’une condition.

  • Les structures de boucles, qui exécutent plusieurs fois un même traitement.

1. Les structures conditionnelles

Deux structures conditionnelles existent.

a. if ... else

La structure if ... else accepte comme paramètre une expression renvoyant une valeur booléenne, comme une expression de comparaison. Si la condition est respectée, le bloc de code correspondant est exécuté.

S’il ne l’est pas, trois possibilités s’offrent à nous :

  • Un bloc else est défini juste après le if, et dans ce cas le code de ce bloc est exécuté.

  • Un ou plusieurs blocs else if existent après le if, et chaque expression de condition est exécutée jusqu’à ce qu’une d’entre elles renvoie true. À ce stade, le bloc de l’instruction else if (ou else, éventuellement) est exécuté.

  • Aucun bloc else ou else if n’existe, et l’exécution du code reprend à la sortie du bloc if.

La syntaxe de cette structure est la suivante :

if (<expression de condition>) 
{ 
    //Placer ici le code à exécuter si l'expression renvoie true 
} 
[ else if (<expression de condition 2>) 
{ 
    //Placer ici le code à exécuter si la première expression  
    //renvoie false et la seconde expression renvoie true 
}] 
[else if...] 
[ else 
{ 
    //Placer ici le code à exécuter si aucune des expressions  
    //des blocs if et else if ne renvoie true 
}] 

L’utilisation de blocs else if ou else est facultative. Mais, très logiquement, un bloc else ou else if ne peut exister sans un bloc if.

Cette structure peut avoir des dizaines de blocs else if associés, mais elle ne peut avoir qu’un seul bloc else.

b. switch

La structure switch choisit une branche d’exécution en fonction d’un argument et de tests de valeurs de ce paramètre. L’argument passé à...

Les fonctions

Les fonctions sont un élément central dans le développement avec C#. En effet, toutes les instructions d’une application écrite en C# doivent être placées dans des fonctions.

Chaque fonction représente une unité de traitement réutilisable pouvant avoir un ou plusieurs paramètres et retournant une valeur.

L’écriture de fonctions permet de structurer le code en découpant de manière logique les fonctionnalités développées. Il est recommandé, pour une bonne lisibilité et une bonne maintenabilité, de limiter la longueur des fonctions.

Nombre de développeurs préconisent ainsi une longueur permettant de voir le code complet d’une fonction dans un écran. Cette longueur est toute relative, mais peut ainsi convenir à chacun. Cette règle n’est évidemment pas absolue mais elle peut aider, notamment dans le cas d’un travail en équipe, à la relecture et au débogage.

Pour tenir cet objectif, il est nécessaire de limiter les responsabilités des fonctions : chacune effectue un type de tâche uniquement.

1. Écriture d’une fonction

La syntaxe générale pour l’écriture d’une fonction est la suivante :

<modificateur d'accès> <type de retour> <Nom de fonction>(  
[paramètre 1, [paramètre 2]...]) 
{ 
    //Traitements 
    return <valeur>; 
} 

Le couple nom/liste de paramètres définit la signature de la fonction. C’est elle qui va permettre au compilateur de reconnaître l’existence d’une fonction lors de son appel.

Le type de retour de la fonction peut être n’importe quel type accessible par le code de la fonction.

Une fonction doit obligatoirement et dans tous les cas retourner une valeur explicitement. Pour cela, on utilise le mot-clé return suivi de la valeur à renvoyer. 

public int CalculerAgeDuCapitaine() 
{ 
    int ageDuCapitaine = 0; 
 
    //Traitements... 
 
    return ageDuCapitaine; 
}  
 
public string RecupererTypeJour() 
{ 
    if (DateTime.Today.Day % 2 == 0) ...

Les tuples

Lorsqu’une fonction doit renvoyer plusieurs valeurs, l’utilisation de paramètres en écriture est une solution tout à fait fonctionnelle. En revanche, elle peut s’avérer rapidement fastidieuse en raison des lourdeurs d’écriture qu’elle implique. Pour éviter cela, la solution la plus cohérente est de renvoyer les différentes valeurs attendues sous la forme d’un ensemble. En C#, ces regroupements de données sont appelés objets : ceci sera abordé en détail au chapitre suivant. La septième mouture du langage intègre la création et l’utilisation d’objets simplistes qui peuvent être utilisés pour retourner plusieurs valeurs : les tuples.

Un tuple est décrit sous la forme d’une suite de types englobée par des parenthèses. Chacun des types correspond à une donnée qui pourra être intégrée dans le groupement de données. La ligne suivante permet de déclarer un tuple contenant deux valeurs entières.

(int, int) maVariable; 

Les tuples peuvent agréger plus de deux valeurs, et même un nombre virtuellement illimité de données. Il n’est toutefois pas recommandé de les utiliser pour regrouper un nombre élevé d’éléments. La déclaration de variable ci-dessous regroupe...

Les attributs

Les attributs sont des éléments de code qui permettent de fournir des informations relatives à d’autres éléments d’une application.

Ils sont enregistrés dans les métadonnées d’un assembly pendant l’étape de compilation et peuvent être lus une fois la compilation terminée. Ils peuvent décrire un assembly, fournir des informations au débogueur ou donner une indication sur l’utilisation d’un élément de code. Il est possible de placer des attributs sur bon nombre d’éléments de code. Ceux-ci sont listés dans l’énumération System.AttributeTargets et incluent notamment les assemblies, les classes et les méthodes.

Un attribut est défini en plaçant dans le code le nom de son type entre les symboles [ et ]. Par convention, les types d’attributs ont un nom terminant par Attribute, mais il est possible, au moment de leur utilisation, de raccourcir ce nom en omettant le suffixe. Les deux déclarations de classe ci-dessous ont donc exactement les mêmes effets.

[ObsoleteAttribute]  
public class Client 
{ 
} 

[Obsolete]  
public class Client 
{ 
} 

La réflexion

La plateforme .NET inclut un jeu de classes et de méthodes permettant de lire les métadonnées des assemblies, dont...