Comment utiliser la classe Buffer en C #

Une mémoire tampon est une séquence d'octets en mémoire et la mise en mémoire tampon est la manipulation de données résidant en mémoire. Dans .NET, la mise en mémoire tampon fait référence à la manipulation de la mémoire non managée, qui est représentée sous la forme d'un tableau d'octets. 

Vous souhaiterez peut-être tirer parti de la classe System.Buffer dans .NET chaque fois que vous avez besoin d'écrire directement des données dans la mémoire ou chaque fois que vous souhaitez manipuler des données stockées dans la mémoire non managée. Cet article explique comment nous pouvons travailler avec la classe Buffer en C #. 

Pour utiliser les exemples de code fournis dans cet article, vous devez disposer de Visual Studio 2019 installé sur votre système. Si vous n'en avez pas déjà une copie, vous pouvez télécharger Visual Studio 2019 ici.

Créer un projet d'application console .NET Core dans Visual Studio

Tout d'abord, créons un projet d'application console .NET Core dans Visual Studio. En supposant que Visual Studio 2019 est installé sur votre système, suivez les étapes décrites ci-dessous pour créer un nouveau projet d'application console .NET Core dans Visual Studio.

  1. Lancez l'IDE de Visual Studio.
  2. Cliquez sur "Créer un nouveau projet".
  3. Dans la fenêtre «Créer un nouveau projet», sélectionnez «Application console (.NET Core)» dans la liste des modèles affichés.
  4. Cliquez sur Suivant.
  5. Dans la fenêtre «Configurer votre nouveau projet» ci-dessous, spécifiez le nom et l'emplacement du nouveau projet.
  6. Cliquez sur Créer.

Cela créera un nouveau projet d'application console .NET Core dans Visual Studio 2019. Nous utiliserons ce projet dans les sections suivantes de cet article.

Méthodes de la classe Buffer dans .NET

La classe Buffer contient les méthodes suivantes:

  • BlockCopy (Array, Int32, Array, Int32) est utilisé pour copier un tableau source d'un décalage spécifié vers un tableau cible à un décalage spécifié.
  • ByteLength (Array) renvoie le nombre total d'octets dans un tableau, c'est-à-dire la longueur du tableau.
  • GetByte (Array, Int32) est utilisé pour récupérer un octet à un emplacement spécifié dans un tableau.
  • SetByte (Array, Int32, Byte) est utilisé pour définir un octet à un emplacement donné dans le tableau.
  • MemoryCopy (Void *, Void *, Int64, Int64) et MemoryCopy (Void *, Void *, UInt64, UInt64) sont utilisés pour copier un certain nombre d'octets d'une adresse source dans la mémoire vers une autre adresse.

Utilisation de tableaux et de tampons en C #

Avant de commencer à travailler avec la classe Buffer et ses membres, explorons la classe Array appartenant à l'espace de noms System. La classe Array contient une méthode nommée Copy () qui peut être utilisée pour copier le contenu d'un tableau dans un autre.

La classe Buffer dans l'espace de noms System contient une méthode nommée BlockCopy () qui fait la même chose. Vous pouvez utiliser BlockCopy () pour copier le contenu d'un tableau source dans un tableau de destination. Il convient de noter que la méthode Buffer.BlockCopy est beaucoup plus rapide que la méthode Array.Copy. La classe Buffer contient également d'autres méthodes telles que ByteLength, GetByte et SetByte.

Notez que la méthode BlockCopy ne copie pas les éléments d'un tableau source. Au lieu de cela, BlockCopy copie une séquence d'octets du tableau source vers le tableau de destination.

Copier les octets entre deux tableaux en C #

Vous pouvez tirer parti de la méthode Buffer.BlockCopy pour copier des octets entre un tableau source et un tableau de destination, comme indiqué dans l'extrait de code ci-dessous.

static void Main ()

{

  court [] arr1 = nouveau court [] {1, 2, 3, 4, 5};

  court [] arr2 = nouveau court [10];

  int sourceOffset = 0;

  int destinationOffset = 0;

  nombre int = 2 * sizeof (court);

  Buffer.BlockCopy (arr1, sourceOffset, arr2, destinationOffset, count);

  pour (int i = 0; i <arr2.Length; i ++)

  {

      Console.WriteLine (arr2 [i]);

  }

  Console.ReadKey ();

}

Lorsque vous exécutez le programme ci-dessus, voici à quoi ressemblerait la sortie dans la fenêtre de la console.

Trouver la longueur d'octet d'un tableau en C #

Pour connaître la longueur d'un tableau, vous pouvez tirer parti de la méthode ByteLength de la classe Buffer, comme indiqué dans l'exemple de code ci-dessous.

static void Main ()

{

  court [] arr1 = nouveau court [] {1, 2, 3, 4, 5};

  court [] arr2 = nouveau court [10];

  Console.WriteLine ("La longueur de arr1 est: {0}",

  Buffer.ByteLength (arr1));

  Console.WriteLine ("La longueur de l'arr2 est: {0}",

  Buffer.ByteLength (arr2));

  Console.ReadKey ();

}

Lorsque vous exécutez le programme ci-dessus, voici à quoi ressemblerait la sortie:

Les méthodes SetByte et GetByte de la classe Buffer peuvent être utilisées pour définir ou lire des octets individuels vers et depuis un tableau respectivement. L'extrait de code suivant illustre comment les méthodes SetByte et GetByte peuvent être utilisées.

static void Main ()

{

court [] arr1 = {5, 25};

longueur int = Buffer.ByteLength (arr1);

Console.WriteLine ("\ nLe tableau d'origine est le suivant: -");

pour (int i = 0; i <longueur; i ++)

{

      octet b = Buffer.GetByte (arr1, i);

      Console.WriteLine (b);

}

Buffer.SetByte (arr1, 0, 100);

Buffer.SetByte (arr1, 1, 100);

Console.WriteLine ("\ nLe tableau modifié est le suivant: -");

pour (int i = 0; i <Buffer.ByteLength (arr1); i ++)

{

      octet b = Buffer.GetByte (arr1, i);

      Console.WriteLine (b);

}

    Console.ReadKey ();

}

Lorsque vous exécutez le programme ci-dessus, voici comment la sortie apparaîtra.

La classe Buffer offre de bien meilleures performances lors de la manipulation d'une région de mémoire qui contient des types primitifs. Vous devez tirer parti de la classe Buffer chaque fois que vous avez besoin de manipuler des données en mémoire et chaque fois que vous avez également besoin d'un accès rapide aux données stockées dans la mémoire.

Comment faire plus en C #:

  • Comment utiliser HashSet en C #
  • Comment utiliser des paramètres nommés et facultatifs en C #
  • Comment comparer le code C # à l'aide de BenchmarkDotNet
  • Comment utiliser des interfaces fluides et le chaînage de méthodes en C #
  • Comment tester des méthodes statiques en C #
  • Comment refactoriser des objets Dieu en C #
  • Comment utiliser ValueTask en C #
  • Comment utiliser l'immuabilité en C
  • Comment utiliser const, readonly et static en C #
  • Comment utiliser les annotations de données en C #
  • Comment travailler avec les GUID en C # 8
  • Quand utiliser une classe abstraite ou une interface en C #
  • Comment travailler avec AutoMapper en C #
  • Comment utiliser les expressions lambda en C #
  • Comment travailler avec les délégués Action, Func et Predicate en C #
  • Comment travailler avec des délégués en C #
  • Comment implémenter un simple logger en C #
  • Comment travailler avec des attributs en C #
  • Comment travailler avec log4net en C #
  • Comment implémenter le modèle de conception de référentiel en C #
  • Comment travailler avec la réflexion en C #
  • Comment travailler avec Filesystemwatcher en C #
  • Comment effectuer une initialisation différée en C #
  • Comment travailler avec MSMQ en C #
  • Comment travailler avec des méthodes d'extension en C #
  • Comment utiliser les expressions lambda en C #
  • Quand utiliser le mot clé volatile en C #
  • Comment utiliser le mot clé yield en C #
  • Comment implémenter le polymorphisme en C #
  • Comment créer votre propre planificateur de tâches en C #
  • Comment travailler avec RabbitMQ en C #
  • Comment travailler avec un tuple en C #
  • Explorer les méthodes virtuelles et abstraites en C #
  • Comment utiliser l'ORM Dapper en C #
  • Comment utiliser le modèle de conception de poids mouche en C #