Les nouveautés de C# 12

Lors d’un blog post du 11 avril , Microsoft a présenté 3 nouvelles features pour C#12.

  • Les constructeurs principaux pour les classes et les structures qui ne sont pas des record
  • Des directives Using pour n’importe quel type via les alias
  • Valeurs par défaut pour les expressions lambda

Nous allons donc détailler chacune de ces 3 features .

Les constructeurs principaux

Pour rappel, cette feature concerne toutes les classes et structures qui ne sont pas des records.

Un record par exemple ressemble à ceci :

ou ceci :

Les records permettent de créer des types avec des propriétés immuables principalement.

Si je reprends l’exemple du blog post :

public class Student(int id, string name, IEnumerable<decimal> grades)
{
    public Student(int id, string name) : this(id, name, Enumerable.Empty<decimal>()) { }
    public int Id => id;
    public string Name { get; set; } = name.Trim();
    public decimal GPA => grades.Any() ? grades.Average() : 4.0m;
} 

La grosse nouveauté se trouve ici : public class Student(int id, string name, IEnumerable grades)

En effet ceci n’était pas possible auparavant.

Ici l’exemple nous montre comment l’utiliser dans les propriétés de la classe en les mappant tel quel ou en utilisant les valeurs en supprimant les espaces(Trim()) ou avec des conditons (grades.Any() ? grades.Average() : 4.0m).

La feature pour moi n’apporte pas grand chose par rapport aux records à part du code plus concis et doncressemble à une feature incomplète pour l’instant.

Si vous souhaitez en savoir plus sur les constructeurs principaux, je vous conseille la vidéo de Christophe Mommer .

Directives Using

C# 12 étend l’utilisation de la prise en charge des directives using à n’importe quel type. Voici quelques exemples pris sur le blog post :

using Measurement = (string, int);
using PathOfPoints = int[];
using DatabaseInt = int?;

En effet les alias existent depuis très longtemps et leur but était d’éviter d’avoir des conflits pour vos imports.

Ici C# 12 nous permet de créer des alias dans les usings pour n’importe quel type de données et ensuite l’utiliser dans votre code!

Par la suite vous pourrez donc utiliser cet alias n’importe ou dans votre code comme suit dans une méthode par exemple 😉

public void F(Measurement x)
{ }

Valeurs par défaut pour les expressions lambda

Nous pouvons maintenant définir des valeurs par défaut pour les expressions lambda :

var addWithDefault = (int addTo = 2) => addTo + 1;
addWithDefault(); // 3
addWithDefault(5); // 6

Dans ce cas la valeur par défaut est 2 et nous évite d’avoir des null reference exception par exemple et force un comportement par défaut dans le cas ou nous n’avons pas de paramètre d’entrée.

Si vous souhaitez plus de détails sur ces features, ça se passe ici.