Sucre syntaxique

Published by Charles DOUANGDARA
Category : .Net
21/05/2025

Dans le domaine de l’informatique, les langages de programmation sont des outils indispensables pour transmettre des opérations complexes à un ordinateur. En effet celui-ci a pour fonction principale de fournir un langage compréhensible par les humains. Celui-ci est par la suite transformé en code plus proche du langage machine dans le cas des langages compilés.

Dans cette démarche de fournir une interface plus utilisable par l’humain, le vocabulaire des langages informatiques évoluent et devient plus lisible et concis. Les sucres syntaxiques sont ces fonctionnalités dans le langage qui rendent plus simple le quotidien des développeurs. Dans cet article nous allons voir 3 sucres syntaxiques dans l’un des langages qui en est friand : le C#.

 
 

1. Le constructeur primaire

 

En C# le constructeur permet de spécifier quels champs sont nécessaires pour la création d’un objet. Souvent cela implique d’initialiser des champs, ce qui est redondant quand les noms entre les paramètres du constructeur et les champs sont les mêmes. Le constructeur primaire est là pour simplifier cette tâche fastidieuse. Ce n’est pas un constructeur qui retourne en enfance mais plutôt un constructeur simplifiant votre vie ! Il permet de faire en sorte que les paramètres du constructeur soient disponibles dans toute la classe. Pour le définir il suffit de rajouter les paramètres après la définition de la classe :

Sans constructeur primaire :

 

 

Avec constructeur primaire :

 

 

Attention !  Les champs du constructeur primaires ne sont quand même pas des propriétés publiques de la classe. On ne peut pas faire this.param. Si nécessaire on peut assigner la valeur initiale d’une propriété de cette manière :

 

 
 

2. Les records

 

C# propose une structure de donnée permettant de représenter … des données. Pour la définir il suffit de remplacer le mot class par record lors de la définition du record :

public record Foo{}

Pourquoi ne pas utiliser directement une classe ? Et bien voyons ensemble ce que les records proposent de  plus.

 

2.1 Egalité

Si on veut voudrait comparer 2 instances d’une même classe selon leur propriétés, il faudrait comparer chaque propriété une à une. En effet pour les classes l’opérateur = compare les références.

Alors qu’avec un record et bien on peut directement comparer les 2 instances. L’opérateur = comparera les valeurs des propriétés. Par exemple pour une classe Order qui a les champs ItemsCount et TotalPrice :

 

 

2.2  Duplication

Avec un record la duplication devient super simple ! Il suffit de rajouter with{} après un record, on peut même mettre dans les accolades les valeurs qui différent.

 

 

2.3 le constructeur primaire

Vu dans la partie 1, il est possible que les champs du constructeur primaire ne deviennent pas des propriétés, et bien .. ce n’est que pour les classes. Pour les records, les champs du constructeur primaire deviennent des propriétés publiques !

 
 

3. Les collections

 

3.1 Création

On peut définir simplement une collection en utilisant des accolades avec les éléments à l’intérieur séparés par des virgules. De plus, on peut également concaténer plusieurs collections ensembles en ajoutant ‘ ..  ‘devant une collection pour qu’elle « s’étale ».

 

 

3.2 Découper une collection

On peut récupérer une partie d’une collection indexée en spécifiant l’index de départ et de fin en utilisant la notation suivante :  collection[<idépart>..<ifin>]. Si on omet l’index de départ alors la collection commence à partir de l’index 0, si on on omet l’index de fin alors le résultat contient tous les éléments de la collection de départ à partir de l’index de départ.

Bonus : Pour définir l’index de fin on peut rajouter ^ devant l’index ce qui permet de dire qu’on veut récupérer les éléments avant count-x la taille de collection. Par exemple [..^^2] récupère tous les éléments de la collection sauf les 2 derniers.