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> |
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; } } |
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); } } |
Code : | Sélectionner tout |
1 2 3 4 5 | [System.Runtime.CompilerServices.InlineArray(10)] public struct Buffer10<T> { private T _element0; } |
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 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