Microsoft livre un aperçu des nouveautés de C# 8.0
Microsoft a dévoilé la feuille de route de C # 7.1, C # 7.2 et C # 8.0,
et propose quelques améliorations à son langage
C # 7.1
async Task Main()
Les mots clés async et await, qui ont été apportés par C # 5.0 facilitent l’écriture du code qui appelle des systèmes externes, ou fait des E/S, sans bloquer un thread. Cela rend les applications Web évolutives et conserve la réactivité des IU d’applications.
Cependant, une fois qu'une partie de votre code est asynchrone, tout ce qui implique ce code doit également devenir asynchrone. Lorsque votre application d'hébergement est une application de console ou un service Windows, cela pose un problème. Vous pouvez écrire async void Main, mais cela signifie que, dès que vous arrivez à votre premier await, l’application entière se termine.
La raison ? async void, qui agit comme un mécanisme de prévention des incendies. Étant donné que vous ne pouvez pas retourner une Task de Main, vous devrez utiliser quelque chose comme AsyncContext depuis la bibliothèque AsyncEx.
Microsoft explique que cela ne sera plus nécessaire : le compilateur et le framework reconnaîtront et exécuteront correctement une méthode Async Task Main.
Les expressions default :
Il s'agit simplement d'une amélioration de quelque chose qui a été supporté depuis C # 2.0 et l'avènement des génériques, en 2005. Il est sous forme de default (T), où T est bien sûr un type. Pour les types de référence, il représente null, et pour les types de valeurs tels que int, il représente la valeur par défaut, non initialisée, de ce type.
La nouvelle fonctionnalité est que, lorsque le type de T peut être déduite, il n'est plus nécessaire de le spécifier.
En clair, au lieu d’écrire ceci
Code:
int x = default(int);
Vous pourrez écrire ceci
Bien sûr, cela s'étend également à d'autres usages de default, tels que les déclarations de retour, les valeurs par défaut pour les arguments, et, en développant le point précédent, les expressions ternaires.
Pour illustrer, ceci sera valide dans une future version de C #
Code:
var x = flag ? 1: default;
:
Déduction des tuples
Supposons que vous voulez créer le tuple (string Nom, string Prenom) et que vous avez déjà des variables locales appelées Nom et Prenom. Vous devez écrire quelque chose comme ceci :
var t = (fNom: Prenom, SecondNom: SecondPrenom);Cette fonctionnalité va déduire les noms des éléments de tuple à partir de leur expression d'initialisation, un peu comme ce que vous pouvez faire avec des types anonymes.
Code:
1 2 3
| var t = (Nom, SecondNom);
Console.WriteLine($"Salut, {t.Nom}!"); |
C # 7.2
Références read-only
Ici, il s’agit de donner à C # la possibilité d'utiliser des paramètres const-like pour améliorer les performances. Connu sous le nom de « paramètres réellement définis » ou « paramètres » simples, ceux-ci permettent de transmettre de grandes structures par référence tout en ne permettant pas qu'elles soient mutées.
C # 8.0
Types de référence nullables
L'équipe responsable du développement de C # a, pour l'instant, choisi de faire en sorte que tous les types de référence deviendront non annulables par défaut, et vous pouvez faire en sorte qu’un type de variable soit nullable en vous servant de “?”. L'utilisation d'une variable non nulle qui pourrait être nulle (car vous ne l'avez pas vérifiée si elle avait déjà pris cette valeur) entraînera un avertissement, tout en attribuant la valeur d'une variable nulle à celle qui n'est pas nullable.
Petit exemple d’illustration
Code:
1 2 3 4 5 6 7
| // bar est nullable parce que son type est string?
void Foo(string? bar)
{
string baz = bar;
// ceci va générer un avertissement parce que baz est non-nullable
// mais bar est nullable
} |
Pour résoudre ce problème, il suffit de vérifier que bar n’est pas null
Code:
1 2 3 4 5 6 7
| void Foo(string? bar)
{
if (bar == null)
throw new ArgumentNullException(nameof(bar));
string baz = bar;
} |
Source : feuille de route
Microsoft livre un aperçu des nouveautés de C# 8.0
Microsoft livre un aperçu des nouveautés de C# 8.0
et envisage de commencer à livrer cette version dans les préversions de Visual Studio 2019
C# 8.0, la prochaine version majeure du langage C# de Microsoft est en préparation depuis un certain temps. Le plan de l'entreprise est que C# 8.0 soit livré en même temps que .NET Core 3.0. Toutefois, les fonctionnalités de la nouvelle version du langage commenceront à être livrées dans les préversions de Visual Studio 2019, la prochaine version majeure de l'EDI phare de Microsoft sur laquelle la firme travaille également.
En attendant, Microsoft a décidé de donner, dans un billet de blog, un aperçu des nouveautés de C# 8.0 pour permettre aux développeurs de savoir à quoi s'attendre.
Nouvelles fonctionnalités de C# 8.0
Types de références nullables
Les types de références nullables constituent l'une des fonctionnalités les plus importantes de C# 8.0. Le but de cette fonctionnalité est d'en finir avec les exceptions de référence null très fréquentes. Pour cela, elle vous empêche de mettre null dans des types de référence ordinaire comme string. Autrement dit, par défaut, ces types seront non nullables ! Mais vous pouvez faire en sorte qu’un type de variable soit nullable en vous servant de "?".
Cette fonctionnalité devrait donc casser le code existant. Un problème que Microsoft a décidé de gérer en douceur en générant des avertissements et non des erreurs. Toujours est-il qu'un code propre d'aujourd'hui pourra se retrouver avec des milliers d'avertissements demain. Vous devez donc choisir d'utiliser la fonctionnalité (ce que vous pouvez faire au niveau du projet, du fichier ou même de la ligne de code source).
Pour illustrer la fonctionnalité, le code suivant va générer un avertissement puisque vous essayez d'assigner un null à un type non nullable :
Code:
string s = null; // Warning: Assignment of null to non-nullable reference type
Si vous voulez le rendre null, vous pouvez utiliser le type de référence nullable associé, c'est-à-dire ici string? :
Code:
string? s = null; // Ok
Les flux asynchrones
La fonctionnalité async/wait de C# 5.0 vous permet d'utiliser (et de produire) des résultats asynchrones sous forme de code simple, sans callback. Toutefois, comme l'explique Microsoft, elle n'est pas très utile si vous souhaitez utiliser (ou produire) des flux continus de résultats, tels que ceux que vous pouvez obtenir d'un appareil IoT ou d'un service cloud. Les flux asynchrones sont donc là pour ça. Microsoft introduit IAsyncEnumerable<T>, qui correspond exactement à ce à quoi vous vous attendiez : une version asynchrone de IEnumerable<T>.
Code:
1 2 3 4 5 6 7
| async IAsyncEnumerable<int> GetBigResultsAsync()
{
await foreach (var result in GetResultsAsync())
{
if (result > 20) yield return result;
}
} |
Les types Range et Index
Microsoft a ajouté un type Index, qui peut être utilisé pour l’indexation. Vous pouvez en créer un à partir d'un intqui permet de compter depuis le début, ou avec un opérateur de préfixe ^ qui permet de compter depuis la fin.
Code:
1 2 3 4
| Index i1 = 3; // number 3 from beginning
Index i2 = ^4; // number 4 from end
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6" |
Microsoft introduit également un type Range, composé de deux index, un pour le début et un pour la fin.
Code:
var slice = a[i1..i2]; // { 3, 4, 5 }
Autres nouveautés et dépendances de plateforme
C# introduit aussi les modèles récursifs (les modèles contenant d'autres modèles), et l'implémentation par défaut des membres d'une interface. Dans le dernier cas notamment, aujourd’hui, une fois que vous publiez une interface, vous ne pouvez pas ajouter de membres sans casser tous les implémenteurs existants, explique Microsoft. Dans C# 8.0, la firme vous permet de fournir un corps pour un membre d'interface. Ainsi, si quelqu'un n'implémente pas ce membre (peut-être parce qu'il n'était pas encore là quand il a écrit son code), il obtient simplement l'implémentation par défaut.
C# 8.0 viendra aussi avec les expressions Switch. Microsoft explique que les instructions Switch avec des modèles sont assez puissantes dans C# 7.0, mais peuvent être fastidieuses à écrire. Les expressions Switch viennent donc comme une version « légère », où tous les cas sont des expressions.
Une nouvelle fonctionnalité vous permettra d'omettre les types dans de nombreux cas. Lorsque vous créez un nouvel objet, le type est parfois déjà fourni à partir du contexte. Dans ces situations, le langage de Microsoft vous laissera omettre le type.
La plupart des fonctionnalités de C# 8.0 s’appliqueront à n’importe quelle version de .NET. Cependant, quelques-unes de ces fonctionnalités dépendent de certaines plateformes et seront spécifiques à .NET Standard 2.1. Il s'agit des flux asynchrones, des types Index et Range qui reposent tous sur de nouveaux types qui feront partie de .NET Standard 2.1. Si .NET Core 3.0 ainsi que Xamarin, Unity et Mono implémenteront complètement .NET Standard 2.1, .NET Framework 4.8 ne le fera pas. Cela signifie que les types requis pour utiliser ces fonctionnalités ne seront pas disponibles lorsque vous ciblerez C# 8.0 sur .NET Framework 4.8. Les implémentations par défaut des membres d’interface reposent aussi sur de nouvelles améliorations de runtime, et Microsoft ne les apportera pas non plus dans .NET Runtime 4.8. Donc, cette fonctionnalité ne fonctionnera tout simplement pas sur .NET Framework 4.8 et sur les anciennes versions de .NET.
Source : Blog Microsoft
Et vous ?
:fleche: Que pensez-vous des nouveautés de C# 8.0 et du fait que certaines ne fonctionneront pas sur .NET Framework 4.8 ?
:fleche: Qu'attendez-vous encore comme fonctionnalités dans le langage de Microsoft ?
Voir aussi :
:fleche: Visual Studio Code 1.29 est disponible : aperçu des nouveautés dans l'éditeur de code open source et multiplateforme de Microsoft
:fleche: Microsoft livre un aperçu des changements de l'expérience et l'interface utilisateur dans Visual Studio 2019, la prochaine version majeure de son EDI
:fleche: Microsoft annonce que ASP.NET Core 3.0 fonctionnera uniquement sur .NET Core 3.0 et ne sera plus compatible avec la plateforme .NET Framework
:fleche: Project Roslyn : comment Microsoft a réécrit son compilateur C# en C# et l'a rendu open source, le lead designer du langage raconte l'histoire
:fleche: MonoGame, le framework C# pour le développement de jeux vidéo arrive en version 3.7