Come usare la classe Buffer in C #

Un buffer è una sequenza di byte in memoria e il buffering è la manipolazione dei dati che risiedono in memoria. In .NET il buffering si riferisce alla manipolazione della memoria non gestita, che è rappresentata come un array di byte. 

Potresti voler sfruttare la classe System.Buffer in .NET ogni volta che devi scrivere dati direttamente in memoria o ogni volta che vuoi manipolare i dati archiviati nella memoria non gestita. Questo articolo spiega come lavorare con la classe Buffer in C #. 

Per lavorare con gli esempi di codice forniti in questo articolo, dovresti avere Visual Studio 2019 installato nel tuo sistema. Se non hai già una copia, puoi scaricare Visual Studio 2019 qui.

Creare un progetto di applicazione console .NET Core in Visual Studio

Prima di tutto, creiamo un progetto di applicazione console .NET Core in Visual Studio. Supponendo che Visual Studio 2019 sia installato nel sistema, seguire i passaggi descritti di seguito per creare un nuovo progetto di applicazione console .NET Core in Visual Studio.

  1. Avvia l'IDE di Visual Studio.
  2. Fai clic su "Crea nuovo progetto".
  3. Nella finestra "Crea nuovo progetto", seleziona "App Console (.NET Core)" dall'elenco dei modelli visualizzati.
  4. Fare clic su Avanti.
  5. Nella finestra "Configura il tuo nuovo progetto" mostrata di seguito, specifica il nome e la posizione per il nuovo progetto.
  6. Fare clic su Crea.

Questo creerà un nuovo progetto di applicazione console .NET Core in Visual Studio 2019. Useremo questo progetto nelle sezioni successive di questo articolo.

Metodi della classe Buffer in .NET

La classe Buffer contiene i seguenti metodi:

  • BlockCopy (Array, Int32, Array, Int32) viene usato per copiare una matrice di origine da un offset specificato a una matrice di destinazione a un offset specificato.
  • ByteLength (Array) restituisce il numero totale di byte in un array, ovvero la lunghezza dell'array.
  • GetByte (Array, Int32) viene utilizzato per recuperare un byte in una posizione specificata in una matrice.
  • SetByte (Array, Int32, Byte) viene utilizzato per impostare un byte in una determinata posizione nella matrice.
  • MemoryCopy (Void *, Void *, Int64, Int64) e MemoryCopy (Void *, Void *, UInt64, UInt64) vengono utilizzati per copiare un numero di byte da un indirizzo di origine nella memoria a un altro indirizzo.

Utilizzo di array e buffer in C #

Prima di iniziare a lavorare con la classe Buffer e i suoi membri, esploriamo la classe Array relativa allo spazio dei nomi System. La classe Array contiene un metodo denominato Copy () che può essere utilizzato per copiare il contenuto di un array in un altro.

La classe Buffer nello spazio dei nomi System contiene un metodo denominato BlockCopy () che fa la stessa cosa. È possibile utilizzare BlockCopy () per copiare il contenuto di un array di origine in un array di destinazione. Si noti che il metodo Buffer.BlockCopy è molto più veloce del metodo Array.Copy. La classe Buffer contiene anche altri metodi come ByteLength, GetByte e SetByte.

Si noti che il metodo BlockCopy non copia gli elementi di un array di origine. Piuttosto, BlockCopy copia una sequenza di byte dall'array di origine all'array di destinazione.

Copiare byte tra due array in C #

È possibile sfruttare il metodo Buffer.BlockCopy per copiare byte tra un array di origine e uno di destinazione, come mostrato nel frammento di codice riportato di seguito.

static void Main ()

{

  short [] arr1 = new short [] {1, 2, 3, 4, 5};

  short [] arr2 = nuovo short [10];

  int sourceOffset = 0;

  int destinationOffset = 0;

  int count = 2 * sizeof (short);

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

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

  {

      Console.WriteLine (arr2 [i]);

  }

  Console.ReadKey ();

}

Quando esegui il programma sopra, ecco come apparirà l'output nella finestra della console.

Trova la lunghezza in byte di una matrice in C #

Per scoprire la lunghezza di un array è possibile sfruttare il metodo ByteLength della classe Buffer come mostrato nell'esempio di codice riportato di seguito.

static void Main ()

{

  short [] arr1 = new short [] {1, 2, 3, 4, 5};

  short [] arr2 = nuovo short [10];

  Console.WriteLine ("La lunghezza di arr1 è: {0}",

  Buffer.ByteLength (arr1));

  Console.WriteLine ("La lunghezza dell'arr2 è: {0}",

  Buffer.ByteLength (arr2));

  Console.ReadKey ();

}

Quando esegui il programma sopra, ecco come apparirà l'output:

I metodi SetByte e GetByte della classe Buffer possono essere utilizzati per impostare o leggere i singoli byte da e verso un array rispettivamente. Lo snipet di codice seguente illustra come utilizzare i metodi SetByte e GetByte.

static void Main ()

{

short [] arr1 = {5, 25};

int length = Buffer.ByteLength (arr1);

Console.WriteLine ("\ nL'array originale è il seguente: -");

for (int i = 0; i <length; i ++)

{

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

      Console.WriteLine (b);

}

Buffer.SetByte (arr1, 0, 100);

Buffer.SetByte (arr1, 1, 100);

Console.WriteLine ("\ nL'array modificato è il seguente: -");

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

{

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

      Console.WriteLine (b);

}

    Console.ReadKey ();

}

Quando esegui il programma sopra, ecco come apparirà l'output.

La classe Buffer fornisce prestazioni molto migliori quando si manipola un'area di memoria che contiene tipi primitivi. Dovresti sfruttare la classe Buffer ogni volta che devi manipolare i dati in memoria e ogni volta che hai bisogno di un accesso rapido anche ai dati archiviati nella memoria.

Come fare di più in C #:

  • Come usare HashSet in C #
  • Come usare parametri denominati e facoltativi in ​​C #
  • Come eseguire il benchmark del codice C # utilizzando BenchmarkDotNet
  • Come usare interfacce fluenti e concatenamento di metodi in C #
  • Come unit test dei metodi statici in C #
  • Come eseguire il refactoring di oggetti God in C #
  • Come usare ValueTask in C #
  • Come usare l'immutabilità in C
  • Come usare const, readonly e static in C #
  • Come usare le annotazioni dei dati in C #
  • Come lavorare con i GUID in C # 8
  • Quando usare una classe astratta e un'interfaccia in C #
  • Come lavorare con AutoMapper in C #
  • Come usare le espressioni lambda in C #
  • Come lavorare con i delegati Action, Func e Predicate in C #
  • Come lavorare con i delegati in C #
  • Come implementare un semplice logger in C #
  • Come lavorare con gli attributi in C #
  • Come lavorare con log4net in C #
  • Come implementare il modello di progettazione del repository in C #
  • Come lavorare con la riflessione in C #
  • Come lavorare con Filesystemwatcher in C #
  • Come eseguire l'inizializzazione pigra in C #
  • Come lavorare con MSMQ in C #
  • Come lavorare con i metodi di estensione in C #
  • Come utilizzare espressioni lambda in C #
  • Quando usare la parola chiave volatile in C #
  • Come utilizzare la parola chiave yield in C #
  • Come implementare il polimorfismo in C #
  • Come creare il proprio pianificatore di attività in C #
  • Come lavorare con RabbitMQ in C #
  • Come lavorare con una tupla in C #
  • Esplorazione di metodi virtuali e astratti in C #
  • Come utilizzare Dapper ORM in C #
  • Come utilizzare il modello di progettazione del peso mosca in C #