IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Microsoft présente un aperçu des nouvelles fonctionnalités de C# 12
Dont l'amélioration de l'InlineArrayAttribute et de l'introduction d'Interceptors

Le , par Jade Emy

13PARTAGES

4  0 
Visual Studio 17.7 Preview 3 et .NET 8 Preview 6 poursuivent l'évolution de C# 12. Cet aperçu comprend des fonctionnalités conçues pour préparer le terrain en vue d'améliorations futures des performances. L'accès aisé aux "Inline arrays" permettra aux bibliothèques de les utiliser dans un plus grand nombre de cas, sans effort de votre part. Cet aperçu présente une fonctionnalité expérimentale appelée "Interceptors", qui permet aux générateurs de réacheminer le code, par exemple pour fournir une optimisation spécifique au contexte. Enfin, nameof est amélioré pour fonctionner dans un plus grand nombre de cas.

Vous pouvez obtenir C# 12 en installant la dernière version de Visual Studio ou la dernière version du SDK .NET. Pour découvrir les fonctionnalités de C# 12, vous devez définir la version linguistique de votre projet sur "preview" :

Code : Sélectionner tout
1
2
3
<PropertyGroup> 
   <LangVersion>preview</LangVersion> 
</PropertyGroup>
nameof : Accès des membres à l'instance

Le mot-clé nameof fonctionne désormais avec les noms de membres, y compris les intiales, sur les membres statiques et dans les attributs :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
internal class NameOf 
{ 
    public string S { get; } = ""; 
    public static int StaticField; 
    public string NameOfLength { get; } = nameof(S.Length); 
    public static void NameOfExamples() 
    { 
        Console.WriteLine(nameof(S.Length)); 
        Console.WriteLine(nameof(StaticField.MinValue)); 
    } 
    [Description($"String {nameof(S.Length)}")] 
    public int StringLength(string s) 
    { return s.Length; } 
}
Inline arrays ou tableaux en ligne

L'InlineArrayAttribute a été introduit dans le moteur d'exécution lors d'un précédent aperçu de .NET 8. Il s'agit d'une fonctionnalité avancée qui sera principalement utilisée par le compilateur, les bibliothèques .NET et quelques autres bibliothèques. L'attribut identifie un type qui peut être traité comme une séquence contiguë de primitives pour des données en ligne indexables ou découpables efficaces, sécurisées en termes de type et de dépassement de capacité. Les bibliothèques .NET améliorent les performances de vos applications et outils utilisant des tableaux en ligne.

Le compilateur crée différentes IL pour accéder aux tableaux en ligne. Il en résulte quelques restrictions, telles que l'impossibilité de prendre en charge les modèles de liste. Dans la plupart des cas, vous accédez aux tableaux en ligne de la même manière qu'aux autres tableaux. La différence d'interface utilisateur permet de gagner en performance sans modifier le code :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
private static void InlineArrayAccess(Buffer10<int> inlineArray) 
{ 
    for (int i = 0; i < 10; i++) 
    { 
        inlineArray[i] = i * i; 
    } 
    foreach (int i in inlineArray) 
    { 
        Console.WriteLine(i); 
    } 
}
La plupart des gens utiliseront des tableaux en ligne plutôt que d'en créer. Mais il est bon de comprendre comment les choses fonctionnent. Les tableaux en ligne sont rapides parce qu'ils reposent sur une disposition exacte d'une longueur spécifiée. Un tableau en ligne est un type comportant un seul champ et marqué par l'attribut InlineArrayAttribute qui spécifie la longueur du tableau. Dans le type utilisé dans l'exemple précédent, l'exécution crée un espace de stockage pour exactement dix éléments dans Buffer10<T> en raison du paramètre d'attribut :

Code : Sélectionner tout
1
2
3
4
5
[System.Runtime.CompilerServices.InlineArray(10)] 
public struct Buffer10<T> 
{ 
    private T _element0; 
}
Interceptors ou Intercepteurs

Cet aperçu introduit une fonctionnalité expérimentale appelée interceptors. Elle est destinée à des scénarios avancés, permettant notamment d'améliorer la compilation anticipée (ahead of time-AOT). En tant que partie expérimentale de .NET 8, elle peut être modifiée ou supprimée dans une version future. Il ne doit donc pas être utilisé dans un contexte de production.

Les intercepteurs permettent de réacheminer des appels de méthodes spécifiques vers un code différent. Les attributs spécifient l'emplacement réel du code source, de sorte que les intercepteurs ne conviennent généralement qu'aux générateurs de sources.

Les intercepteurs étant une fonctionnalité expérimentale, vous devrez les activer explicitement dans votre fichier de projet :

Code : Sélectionner tout
1
2
3
<PropertyGroup> 
   <Features>InterceptorsPreview<Features> 
</PropertyGroup>
Les intercepteurs permettent de créer des modèles de code intéressants. En voici quelques exemples :

  • Les appels connus au moment de la compilation, comme Regex.IsMatch(@"a+b+") avec un motif constant, peuvent être interceptés afin d'utiliser un code généré de manière statique pour une optimisation qui est favorable à l'AOT.
  • Les appels ASP.NET Minimal API comme app.MapGet("/products", handler: (int? page, int? pageLength, MyDb db) => { ... }) peuvent être interceptés pour enregistrer un thunk généré statiquement qui appelle directement le handler de l'utilisateur, en évitant l'allocation et l'indirection.
  • Dans la vectorisation, où les boucles foreach contiennent des appels à des méthodes utilisateur, le compilateur peut réécrire le code pour vérifier et utiliser les éléments intrinsèques pertinents au moment de l'exécution, mais revenir au code d'origine si ces éléments intrinsèques ne sont pas disponibles.
  • Résolution statique du graphe de dépendance pour l'injection de dépendance, où provider.Register<MyService>() peut être intercepté.
  • Les appels aux fournisseurs de requêtes pourraient être interceptés pour offrir une traduction dans un autre langage (par exemple SQL) au moment de la compilation, plutôt que d'évaluer les arbres d'expression à traduire au moment de l'exécution.
  • Les sérialiseurs pourraient générer une (dé)sérialisation spécifique au type en fonction du type concret des appels tels que Serialize<MyType>(), le tout au moment de la compilation.


La plupart des programmeurs n'utiliseront pas directement les intercepteurs, mais Microsoft espère qu'ils joueront un rôle important dans leur démarche visant à accélérer l'exécution de vos applications et à faciliter leur déploiement. Les intercepteurs devraient rester expérimentaux dans la version C# 12/.NET 8 et pourraient être inclus dans une future version de C#.


Source : Microsoft

Et vous ?

Que pensez-vous de ces nouvelles fonctionnalités de C# 12 ?

Voir aussi :

Augmentation de la popularité de C#, selon l'indice Tiobe
Qui lui a observé une croissance de près de 2% au cours des 12 derniers mois, tandis que C a perdu pratiquement autant en popularité


Un premier aperçu des fonctionnalités de C# 11 est disponible avec la vérification des paramètres null,
Et les motifs de liste


Microsoft présente un aperçu de trois nouvelles fonctionnalités de C# 12
Dont les constructeurs primaires pour les classes ou les structures et la définition d'alias pour tous les types

Une erreur dans cette actualité ? Signalez-nous-la !