Dans le billet du jour, nous allons partir à la découverte de nouvelles fonctionnalités introduites avec C# 7.2: Span
L'objectif de ces deux nouvelles structures est de faciliter la manipulation de données, par exemple sous forme de tableau, et ceci de manière performante. Mais cela ne se limite pas aux tableaux ! Il peut s'agir d'un buffer, d'une string, de mémoire non managée, etc... Il s'agit donc d'une abstraction très intéressante pour la manipulation des données. Le seul prérequis : que les données soient contiguës en mémoire.
Span
L'intérêt majeur de Span
Prenons ce petit exemple:
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Span
Span
Dans un premier temps, on instancie un tableau. Cela sera la base pour la suite.
Ensuite, on crée un Span
Il est ensuite facile de créer un sous-tableau. Ici, la variable subSpan est un tableau de 3 éléments débutant à partir de l'élément situé à l'index 4 (soit 5, 6, 7).
L'avantage donc, est que ce nouveau «tableau» n'a pas nécessité d'allocation! Et il y a même encore plus fort.
subSpan = 0;
Ici, on modifie le second élément de notre sous-tableau, pour l'initialiser à 0. Donc maintenant, le sous-tableau contient les éléments 5, 0, 7.
Mais si on regarde le tableau initial, on constate qu'il est également modifié, preuve qu'il n'y a pas de copie!
Comment ça marche? En fait, très simplement. Une structure Span
Et ce n'est pas fini! Span
public struct MyStruct
{
public int Value;
}
...
MyStruct[] array = {
new MyStruct() { Value = 1 },
new MyStruct() { Value = 2 },
new MyStruct() { Value = 3 }
};
Span
List
span.Value = 42;
list.Value = 42; // Ne compile pas
Ici, à partir d'un tableau, j'ai initialisé un Span
Mais du coup, cela impose quand même quelques limitations. En effet, afin de garder une gestion de la mémoire performante, une instance de Span
Dans la plupart des cas, cela n'est pas un véritable souci, car cette structure permet surtout d'optimiser des algorithmes via une gestion performante des sous-tableaux.
Mais il peut y avoir des cas où cela serait utile, notamment dans le cas de procédure asynchrone. Et c'est là que Memory
Memory
Comme Span
Par contre, contrairement à Span
ReadOnlySpan
Dans le cas où il n'est pas nécessaire de modifier le tableau initial, mais uniquement d'y accéder, il est possible d'utiliser un ReadOnlySpan
L'avantage, c'est que le ReadOnlySpan
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.