Programmering

Hvordan bruke bufferklassen i C #

En buffer er en sekvens av byte i minnet, og buffering er manipulering av data som ligger i minnet. I .NET buffering refererer til manipulering av det ikke-administrerte minnet, som er representert som en rekke byte.

Det kan være lurt å dra nytte av klassen System.Buffer i .NET når du trenger å skrive data til minnet direkte eller når du vil manipulere data som er lagret i ustyrt minne. Denne artikkelen snakker om hvordan vi kan jobbe med bufferklassen i C #.

For å jobbe med kodeeksemplene som er gitt i denne artikkelen, bør du ha Visual Studio 2019 installert på systemet ditt. Hvis du ikke allerede har en kopi, kan du laste ned Visual Studio 2019 her.

Opprett et .NET Core-konsollapplikasjonsprosjekt i Visual Studio

La oss først lage et .NET Core-konsollapplikasjonsprosjekt i Visual Studio. Forutsatt at Visual Studio 2019 er installert i systemet ditt, følger du trinnene som er beskrevet nedenfor for å opprette et nytt .NET Core-konsollapplikasjonsprosjekt i Visual Studio.

  1. Start Visual Studio IDE.
  2. Klikk på "Opprett nytt prosjekt."
  3. I vinduet "Opprett nytt prosjekt" velger du "Konsollapp (.NET Core)" fra listen over maler som vises.
  4. Klikk på Neste.
  5. I vinduet “Konfigurer ditt nye prosjekt” som vises, angir du navnet og stedet for det nye prosjektet.
  6. Klikk på Opprett.

Dette oppretter et nytt .NET Core-konsollapplikasjonsprosjekt i Visual Studio 2019. Vi bruker dette prosjektet i de påfølgende delene av denne artikkelen.

Metoder for bufferklassen i .NET

Buffer-klassen inneholder følgende metoder:

  • BlockCopy (Array, Int32, Array, Int32) brukes til å kopiere en kildematrise fra en spesifisert forskyvning til en målgruppe ved en spesifisert forskyvning.
  • ByteLength (Array) returnerer det totale antallet byte i en matrise, dvs. lengden på matrisen.
  • GetByte (Array, Int32) brukes til å hente en byte på et spesifisert sted i en matrise.
  • SetByte (Array, Int32, Byte) brukes til å sette en byte på et gitt sted i matrisen.
  • MemoryCopy (Void *, Void *, Int64, Int64) og MemoryCopy (Void *, Void *, UInt64, UInt64) brukes til å kopiere et antall byte fra en kildeadresse i minnet til en annen adresse.

Bruke matriser og buffere i C #

Før vi begynner å jobbe med Buffer-klassen og dens medlemmer, la oss utforske Array-klassen som gjelder systemnavnet. Array-klassen inneholder en metode som heter Copy () som kan brukes til å kopiere innholdet i en matrise til en annen.

Buffer-klassen i systemnavnet inneholder en metode som heter BlockCopy () som gjør det samme. Du kan bruke BlockCopy () til å kopiere innholdet i en kildematrise til en destinasjonsmatrise. Det skal bemerkes at Buffer.BlockCopy-metoden er mye raskere enn Array.Copy-metoden. Buffer-klassen inneholder også andre metoder som ByteLength, GetByte og SetByte.

Merk at BlockCopy-metoden ikke kopierer elementene i et kildearray. Snarere kopierer BlockCopy en bytesekvens fra kildearrayen til destinasjonsmatrisen.

Kopier byte mellom to matriser i C #

Du kan dra nytte av Buffer.BlockCopy-metoden for å kopiere byte mellom et kildearray og et destinasjonsmatrix - som vist i kodebiten gitt nedenfor.

statisk tomrom Main ()

{

kort [] arr1 = ny kort [] {1, 2, 3, 4, 5};

kort [] arr2 = ny kort [10];

int sourceOffset = 0;

int destinasjonOffset = 0;

int count = 2 * sizeof (kort);

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

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

  {

Console.WriteLine (arr2 [i]);

  }

Console.ReadKey ();

}

Når du kjører ovennevnte program, kan du se hvordan utdataene ser ut i konsollvinduet.

Finn byte-lengden på en matrise i C #

For å finne ut lengden på en matrise kan du dra nytte av ByteLength-metoden i bufferklassen som vist i kodeeksemplet nedenfor.

statisk tomrom Main ()

{

kort [] arr1 = ny kort [] {1, 2, 3, 4, 5};

kort [] arr2 = ny kort [10];

Console.WriteLine ("Lengden på arr1 er: {0}",

Buffer.ByteLength (arr1));

Console.WriteLine ("Lengden på arr2 er: {0}",

Buffer.ByteLength (arr2));

Console.ReadKey ();

}

Når du kjører ovennevnte program, ser du hvordan utdataene ser ut:

Metodene SetByte og GetByte i Buffer-klassen kan brukes til å angi eller lese individuelle byte til henholdsvis og fra en matrise. Følgende kodebit illustrerer hvordan metodene SetByte og GetByte kan brukes.

statisk tomrom Main ()

{

kort [] arr1 = {5, 25};

int lengde = Buffer.ByteLengde (arr1);

Console.WriteLine ("\ nDen opprinnelige matrisen er som følger: -");

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

{

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

Console.WriteLine (b);

}

Buffer.SetByte (arr1, 0, 100);

Buffer.SetByte (arr1, 1, 100);

Console.WriteLine ("\ nDen modifiserte matrisen er som følger: -");

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

{

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

Console.WriteLine (b);

}

Console.ReadKey ();

}

Når du kjører programmet ovenfor, kan du se hvordan resultatet blir.

Buffer-klassen gir mye bedre ytelse når du manipulerer et område med minne som inneholder primitive typer. Du bør dra nytte av bufferklassen når du trenger å manipulere data i minnet og når du trenger rask tilgang til data som er lagret i minnet også.

Hvordan gjøre mer i C #:

  • Hvordan bruke HashSet i C #
  • Hvordan bruke navngitte og valgfrie parametere i C #
  • Slik benchmarker du C # -kode ved hjelp av BenchmarkDotNet
  • Hvordan bruke flytende grensesnitt og metodekjetting i C #
  • Hvordan enhetstest statiske metoder i C #
  • Hvordan refaktorere Guds objekter i C #
  • Hvordan bruke ValueTask i C #
  • Hvordan bruke uforanderlighet i C
  • Slik bruker du const, readonly og static i C #
  • Slik bruker du datanoteringer i C #
  • Hvordan jobbe med GUIDer i C # 8
  • Når skal jeg bruke en abstrakt klasse vs. grensesnitt i C #
  • Hvordan jobbe med AutoMapper i C #
  • Hvordan bruke lambdauttrykk i C #
  • Hvordan jobbe med Action-, Func- og Predicate-delegater i C #
  • Hvordan jobbe med delegater i C #
  • Slik implementerer du en enkel logger i C #
  • Hvordan jobbe med attributter i C #
  • Hvordan jobbe med log4net i C #
  • Slik implementerer du mønsteret for depotdesign i C #
  • Hvordan jobbe med refleksjon i C #
  • Hvordan jobbe med filsystemwatcher i C #
  • Hvordan utføre lat initialisering i C #
  • Hvordan jobbe med MSMQ i C #
  • Hvordan jobbe med utvidelsesmetoder i C #
  • Hvordan vi lambdauttrykk i C #
  • Når skal du bruke det flyktige nøkkelordet i C #
  • Slik bruker du avkastningsnøkkelordet i C #
  • Hvordan implementere polymorfisme i C #
  • Hvordan lage din egen oppgaveplanlegger i C #
  • Hvordan jobbe med RabbitMQ i C #
  • Hvordan jobbe med en tuple i C #
  • Utforske virtuelle og abstrakte metoder i C #
  • Hvordan bruke Dapper ORM i C #
  • Hvordan bruke flyvevekt mønster i C #
$config[zx-auto] not found$config[zx-overlay] not found