C# 9 publié avec des enregistrements, des setters Init-Only et des améliorations de correspondance de modèles

Microsoft a livré C # 9.0 dans le cadre de la version de la plate-forme de développement .NET 5. .NET 5 est associé à C# 9.0, qui apporte de nombreuses nouvelles fonctionnalités au langage. Les nouvelles fonctionnalités du langage incluent des enregistrements, des setters init-only, des instructions de niveau supérieur, des améliorations de correspondance de modèles, de nouvelles expressions de type cible, des retours covariants et bien plus encore !

Un grand objectif de C # 9.0 est une représentation immuable des formes de données, et qui est principalement représentée avec de nouveaux types d’enregistrement et des propriétés init-only. Habituellement, les enregistrements sont marqués comme l’une des nouvelles fonctionnalités les plus intéressantes de la version C# 9.0.

L’enregistrement est un nouveau type de référence immuable en C#. Le résultat de leur attribution ou de la modification des valeurs est une création de la copie de cet objet. C’est de la même manière que .NET traite les types de valeur et les chaînes. Une autre caractéristique immuable de la version est les propriétés init-only, plus précisément, init accesseur, une variante du set accesseur qui ne peut être appelé que lors de l’initialisation de l’objet pour une propriété particulière.

La plus grande différence avec les classes est que les types d’enregistrement utilisent l’égalité basée sur la valeur et qu’ils sont immuables par défaut. En les utilisant, tout l’objet immuable est créé, pas seulement ses propriétés individuelles. Habituellement, pour créer des types de référence immuables, le C # vous oblige à écrire un peu de code supplémentaire.

L’utilisation des enregistrements présente quelques avantages. Ils ont plus de sens dans un programme concurrent avec des données partagées. Pour ces cas particuliers, la réponse est l’utilisation des enregistrements. Il s’agit de la fonctionnalité la plus élégante et la plus utile pour obtenir l’immuabilité de vos types en C#.

Pour créer le type d’enregistrement, le mot-clé record doit être utilisé. Dans l’exemple ci-dessous, nous pouvons voir l’exemple le plus simple de création d’un type d’enregistrement d’une personne.

La Person Le type d’enregistrement ci-dessous contient deux propriétés en lecture seule : FirstName et LastName. Il s’agit d’un type de référence immuable et aucune des propriétés ne peut être modifiée une fois qu’il a été créé.

public record Person
{
    public string LastName { get; }
    public string FirstName { get; }

    public Person(string first, string last) => (FirstName, LastName) = (first, last);
}

Pour créer une nouvelle valeur et représenter un nouvel état, C# 9.0 apporte la prise en charge des expressions with. L’expression with fournit une copie de son opérande d’enregistrement avec les propriétés et les champs spécifiés qui sont modifiés. Il est nécessaire que ces propriétés aient un accesseur init ou set défini.

var person = new Person { FirstName = "Almir", LastName = "Vuk" };
var otherPerson = person with { LastName = "Casals" };

La spécification complète pour les enregistrements de types de référence immuables peut être trouvée ici.

Les setters init-only sont une nouvelle fonctionnalité qui peut être déclarée dans n’importe quel type que vous voulez, pas seulement dans les enregistrements. Les setters init-only fournissent une approche intéressante pour initialiser un objet sans avoir à écrire un tas de code passe-partout. Ils peuvent être utilisés pour mettre en évidence la syntaxe de l’initialiseur de propriété afin de définir ces valeurs dans les expressions de création, mais ces propriétés sont en lecture seule une fois la construction terminée. Cela peut se traduire par un code plus facile à maintenir et plus lisible. Un scénario de cas d’utilisation courant concerne les objets de transfert de données. L’exemple suivant est contenu dans la documentation officielle de Microsoft. Il montre la structure nommée WeatherObservation qui a trois propriétés avec un init setter, et elles sont facilement accessibles par le ToString méthode.

public struct WeatherObservation
{
    public DateTime RecordedAt { get; init; }
    public decimal TemperatureInCelsius { get; init; }
    public decimal PressureInMillibars { get; init; }

    public override string ToString() =>
        $"At {RecordedAt:h:mm tt} on {RecordedAt:M/d/yyyy}: " +
        $"Temp = {TemperatureInCelsius}, with {PressureInMillibars} pressure";
}

Plus d’informations sur les setters init only peuvent être trouvées dans la spécification de la langue officielle.

Lors de l’écriture de programmes simples et de fichiers de code avec C #, cela produit beaucoup de code passe-partout. Parfois, cela peut être écrasant pour les débutants car cela encombre le code et y ajoute des niveaux d’indentation. Avec la prise en charge des instructions de niveau supérieur par C# 9.0, un exemple simple de hello world ressemble à ceci :

using System;

Console.WriteLine("Hello World!");

Il est important de noter qu’un seul fichier du projet peut utiliser des instructions de niveau supérieur, sinon le compilateur signalera une erreur. L’erreur sera également signalée s’il existe une combinaison d’instructions de niveau supérieur avec une méthode de point d’entrée de programme déclarée, comme la méthode Main. Un seul fichier peut contenir les instructions et ce serait normalement dans la méthode Main d’une classe Program.

Comme il est indiqué dans la documentation de Microsoft, “L’une des utilisations les plus courantes de cette fonctionnalité est la création de supports pédagogiques. Les développeurs C# débutants peuvent écrire le canonique “Hello World!” Cependant, les développeurs chevronnés trouveront également de nombreuses utilisations pour cette fonctionnalité. Les instructions de niveau supérieur permettent une expérience de type script pour une expérimentation similaire à ce que fournissent les blocs-notes Jupyter. Les instructions de niveau sont idéales pour les petits programmes et utilitaires de console. Les fonctions Azure sont idéales. cas d’utilisation pour les instructions de niveau supérieur.”

Avec C# 9.0, vous pouvez également omettre le type sur le côté droit, au cas où il existe un type clair auquel l’expression est affectée. Par exemple, lorsqu’il y a beaucoup de répétitions, comme dans un tableau ou une initialisation d’objet.

Point p = new (3, 5);

Point[] ps = { new (1, 2), new (5, 2), new (5, -3), new (1, -3) };

Les détails sur la nouvelle expression typée cible se trouvent dans la spécification de la langue officielle.

La fonctionnalité mineure mais toujours importante de cette version est que les déclarations de fonctions locales sont désormais autorisées à avoir des attributs. En les utilisant, les développeurs peuvent rendre le codeur plus propre et plus facile à lire. David Fowler, architecte logiciel chez Microsoft, lui a déjà trouvé une belle utilisation. Dans ce Publication sur Twitteril a utilisé l’attribut pour une fonction locale à l’intérieur de UseEndpoints configuration du middleware. De nombreux commentaires et retours sur cette fonctionnalité ont été échangés. Vous trouverez plus d’informations sur la fonctionnalité dans la spécification de la langue officielle.

C# 9.0 apporte également de nouvelles améliorations de correspondance de modèles, plus d’informations sur les améliorations de correspondance de modèles peuvent être trouvées dans la spécification de langue officielle.

La proposition de spécification complète pour C# 9.0 est disponible. De plus, la session technique présentée à .NET Conf 2020 mettant en évidence les nouvelles fonctionnalités du langage peut être trouvée sur YouTube. C# 9.0 est inclus dans les dernières versions de Visual Studio 2019.

.

Leave a Comment