Programmering

Sådan bruges bufferklassen i C #

En buffer er en sekvens af bytes i hukommelsen, og buffering er manipulation af data, der findes i hukommelsen. I .NET-buffering henvises til manipulationen af ​​den ikke-administrerede hukommelse, som er repræsenteret som en række bytes.

Det kan være en god idé at drage fordel af System.Buffer-klassen i .NET, når du har brug for at skrive data direkte til hukommelsen, eller når du vil manipulere data, der er gemt i ikke-administreret hukommelse. Denne artikel taler om, hvordan vi kan arbejde med bufferklassen i C #.

For at arbejde med kodeeksemplerne i denne artikel skal du have Visual Studio 2019 installeret i dit system. Hvis du ikke allerede har en kopi, kan du downloade Visual Studio 2019 her.

Opret et .NET Core-konsolapplikationsprojekt i Visual Studio

Lad os først oprette et .NET Core-konsolapplikationsprojekt i Visual Studio. Forudsat at Visual Studio 2019 er installeret i dit system, skal du følge nedenstående trin for at oprette et nyt .NET Core-konsolapplikationsprojekt i Visual Studio.

  1. Start Visual Studio IDE.
  2. Klik på "Opret nyt projekt."
  3. I vinduet "Opret nyt projekt" skal du vælge "Konsolapp (.NET Core)" fra listen over skabeloner, der vises.
  4. Klik på Næste.
  5. I vinduet "Konfigurer dit nye projekt", der vises nedenfor, skal du angive navnet og placeringen for det nye projekt.
  6. Klik på Opret.

Dette opretter et nyt .NET Core-konsolapplikationsprojekt i Visual Studio 2019. Vi bruger dette projekt i de efterfølgende afsnit i denne artikel.

Metoder til bufferklassen i .NET

Buffer-klassen indeholder følgende metoder:

  • BlockCopy (Array, Int32, Array, Int32) bruges til at kopiere et kildearray fra en specificeret offset til et target array ved en specificeret offset.
  • ByteLength (Array) returnerer det samlede antal bytes i en array, dvs. længden af ​​arrayet.
  • GetByte (Array, Int32) bruges til at hente en byte på et bestemt sted i en matrix.
  • SetByte (Array, Int32, Byte) bruges til at indstille en byte på et givet sted i arrayet.
  • MemoryCopy (Void *, Void *, Int64, Int64) og MemoryCopy (Void *, Void *, UInt64, UInt64) bruges til at kopiere et antal bytes fra en kildeadresse i hukommelsen til en anden adresse.

Brug af arrays og buffere i C #

Før vi begynder at arbejde med Buffer-klassen og dens medlemmer, lad os udforske Array-klassen, der vedrører Systemnavneområdet. Array-klassen indeholder en metode ved navn Copy (), der kan bruges til at kopiere indholdet af et array til et andet.

Buffer-klassen i systemnavneområdet indeholder en metode ved navn BlockCopy (), der gør det samme. Du kan bruge BlockCopy () til at kopiere indholdet af et kildearray til et destinationsarray. Det skal bemærkes, at metoden Buffer.BlockCopy er meget hurtigere end Array.Copy-metoden. Buffer-klassen indeholder også andre metoder såsom ByteLength, GetByte og SetByte.

Bemærk, at BlockCopy-metoden ikke kopierer elementerne i et kildearray. Snarere kopierer BlockCopy en sekvens af bytes fra kildearrayet til destinationsarrayet.

Kopier bytes mellem to arrays i C #

Du kan drage fordel af Buffer.BlockCopy-metoden til at kopiere byte mellem et kildearray og et destinationsarray - som vist i kodestykket nedenfor.

statisk tomrum Main ()

{

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

kort [] arr2 = ny kort [10];

int sourceOffset = 0;

int destinationOffset = 0;

int antal = 2 * størrelse (kort);

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

for (int i = 0; i <arr2.Længde; i ++)

  {

Console.WriteLine (arr2 [i]);

  }

Console.ReadKey ();

}

Når du udfører ovenstående program, skal du se, hvordan output ser ud i konsolvinduet.

Find byte-længden af ​​en matrix i C #

For at finde ud af længden af ​​en matrix kan du drage fordel af ByteLength-metoden i bufferklassen som vist i kodeeksemplet nedenfor.

statisk tomrum Main ()

{

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

kort [] arr2 = ny kort [10];

Console.WriteLine ("Arr1's længde er: {0}",

Buffer.ByteLength (arr1));

Console.WriteLine ("Arr2's længde er: {0}",

Buffer.ByteLength (arr2));

Console.ReadKey ();

}

Når du kører ovenstående program, her er hvordan output ville se ud:

Metoderne SetByte og GetByte i bufferklassen kan bruges til at indstille eller læse individuelle bytes til henholdsvis og fra en matrix. Følgende kodestykker illustrerer, hvordan SetByte- og GetByte-metoderne kan bruges.

statisk tomrum Main ()

{

kort [] arr1 = {5, 25};

int længde = Buffer.ByteLængde (arr1);

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

for (int i = 0; i <længde; i ++)

{

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

Console.WriteLine (b);

}

Buffer.SetByte (arr1, 0, 100);

Buffer.SetByte (arr1, 1, 100);

Console.WriteLine ("\ nDet modificerede array 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 udfører ovenstående program, kan du se, hvordan output vises.

Buffer-klassen giver meget bedre ydeevne, når man manipulerer et område med hukommelse, der indeholder primitive typer. Du bør udnytte bufferklassen, når du har brug for at manipulere data i hukommelsen, og når du også har brug for hurtig adgang til data, der er gemt i hukommelsen.

Sådan gør du mere i C #:

  • Sådan bruges HashSet i C #
  • Sådan bruges navngivne og valgfri parametre i C #
  • Sådan benchmarkes C #-kode ved hjælp af BenchmarkDotNet
  • Sådan bruges flydende grænseflader og metodekædning i C #
  • Sådan enhedstest statiske metoder i C #
  • Sådan refaktorerer du Guds objekter i C #
  • Sådan bruges ValueTask i C #
  • Sådan bruges uforanderlighed i C
  • Sådan bruges const, readonly og static i C #
  • Sådan bruges datanoteringer i C #
  • Sådan arbejder du med GUID'er i C # 8
  • Hvornår skal man bruge en abstrakt klasse vs. interface i C #
  • Sådan arbejder du med AutoMapper i C #
  • Sådan bruges lambda-udtryk i C #
  • Sådan arbejder du med Action-, Func- og Predicate-delegerede i C #
  • Sådan arbejder du med delegerede i C #
  • Sådan implementeres en simpel logger i C #
  • Sådan arbejder du med attributter i C #
  • Sådan arbejder du med log4net i C #
  • Sådan implementeres depotdesignmønsteret i C #
  • Sådan arbejder du med refleksion i C #
  • Sådan arbejder du med filsystemwatcher i C #
  • Sådan udføres doven initialisering i C #
  • Sådan arbejder du med MSMQ i C #
  • Sådan arbejder du med udvidelsesmetoder i C #
  • Hvordan vi lambda-udtryk i C #
  • Hvornår skal du bruge det flygtige nøgleord i C #
  • Sådan bruges afkastnøgleordet i C #
  • Sådan implementeres polymorfisme i C #
  • Sådan bygger du din egen opgaveplanlægning i C #
  • Sådan arbejder du med RabbitMQ i C #
  • Sådan arbejder du med en tuple i C #
  • Udforskning af virtuelle og abstrakte metoder i C #
  • Sådan bruges Dapper ORM i C #
  • Sådan bruges designmønsteret med flyvægt i C #