.Net Standard 2.1, ce qui nous attend
Environ un an après la sortie de .Net Standard 2.0, la version 2.1, est en cours de finalisation. Si on se fie au Github de l'équipe, ils ont déjà fait plus de 80% du travail et commencent déjà à communiquer sur les nouveautés. C'est donc pour bientôt !
Nous allons en profiter pour établir un aperçu des fonctionnalités majeures à date.
Span<T>
Déjà présent en .Net Core 2.1, ce type permet de manipuler le type T comme dans un tableau, mais ceci de manière beaucoup plus performante. Avec la conversion automatique d'un tableau de T en Span<T>, il est aisé de manipuler tout ou partie du tableau. A noter que le Span ne fait pas de copie des données, ce qui permet, à travers la modification des valeurs Span, de modifier le tableau lui-même. Voici un exemple simple :
Avec cet ajout, de nombreuses méthodes du framework vont être mises au goût du jour et accepter en paramètre Span<T>.
Pour plus d'informations, vous pouvez vous référer à la documentation présente sur le site de Microsoft.
Reflection EMIT
En .Net Standard, EMIT n'était pas disponible car toutes les plateformes (sur lesquelles .Net Standard fonctionne) ne supportent pas la génération de code à la volée. Pour la version 2.1, l'équipe n'a bien sûr pas pu passer outre, cependant ils ont ajouté le support d'EMIT pour les plateformes qui le supportent. En complément à cela, ils ont ajouté deux propriétés (RuntimeFeature.IsDynamicCodeSupported et RuntimeFeature.IsDynamicCodeCompiled). qui permettent de savoir si la plateforme supporte EMIT (et donc vous permettre de savoir si vous pouvez faire de la compilation dynamique).
SIMD
En .Net Standard, SIMD (qui permet de faire plusieurs traitements très poussés en parallèle) n'était pas non plus supporté. Les équipes ont mis en place SIMD dans la BCL pour des opérations de base, notamment la comparaison de chaîne. Comme pour EMIT, les équipes n'ont pas pu exposer les apis SIMD pour nous développeurs, toujours par rapport aux différences entre les plateformes. Peut-être pour une prochaine version ?
ValueTask et ValueTask<T>
Les ValueTask et ValueTask<T> disponibles en .Net Core 2.1 sont désormais disponibles en .Net Standard 2.1. Ces types fonctionnent peu ou prou comme Task et Task<T> (les différences étant principalement sur les performances, notamment sur du code appelé régulièrement, dans une boucle par exemple). Ils sont utilisés par le framework et sont également exposés pour nous, les développeurs. Si vous souhaitez en savoir d'avantage sur ces types, je vous laisse prendre connaissance de la documentation (ValueTask, ValueTask<T>).
DbProviderFactories
DbProviderFactories n'avait pas été porté en .Net Standard 2.0, c'est maintenant chose faite pour la version 2.1. Cette classe permet d'enregistrer des DbProviderFactory, et de les obtenir à partir de leur DbConnection, d'un DataRow, ou de leur nom. Ce système présente l'avantage de rendre agnostique l'application (par rapport au SGBD utilisé) et ainsi ne pas avoir de référence direct au provider spécifique, la factory se charge elle même de charger la dll correspondante.
.Net Standard continue donc de supporter de plus en plus de fonctionnalités et tend à s'approcher des autres plateformes supportées par le .Net.
Si cette première cartographie ne vous convient pas, ou si vous voulez agir sur les 20% de travail restant, je vous invite à aller faire entendre votre voix sur le GitHub de .Net Standard. Les équipes de Microsoft étant très ouvertes aux suggestions faites sur la plateforme, tout est possible !
J'en profite également pour vous invitez a poursuivre votre lecture par l'article de Jonathan Antoine sur les nouveautés de .Net Core 3.0.
Commentaires