Verwendung der Buffer-Klasse in C #

Ein Puffer ist eine Folge von Bytes im Speicher und das Puffern ist die Manipulation von Daten, die sich im Speicher befinden. In .NET bezieht sich die Pufferung auf die Manipulation des nicht verwalteten Speichers, der als Array von Bytes dargestellt wird. 

Möglicherweise möchten Sie die System.Buffer-Klasse in .NET nutzen, wenn Sie Daten direkt in den Speicher schreiben müssen oder wenn Sie Daten bearbeiten möchten, die im nicht verwalteten Speicher gespeichert sind. Dieser Artikel beschreibt, wie wir mit der Buffer-Klasse in C # arbeiten können. 

Um mit den in diesem Artikel bereitgestellten Codebeispielen arbeiten zu können, muss Visual Studio 2019 auf Ihrem System installiert sein. Wenn Sie noch keine Kopie haben, können Sie Visual Studio 2019 hier herunterladen.

Erstellen Sie ein .NET Core-Konsolenanwendungsprojekt in Visual Studio

Zunächst erstellen wir ein .NET Core-Konsolenanwendungsprojekt in Visual Studio. Angenommen, Visual Studio 2019 ist auf Ihrem System installiert, führen Sie die folgenden Schritte aus, um ein neues .NET Core-Konsolenanwendungsprojekt in Visual Studio zu erstellen.

  1. Starten Sie die Visual Studio-IDE.
  2. Klicken Sie auf "Neues Projekt erstellen".
  3. Wählen Sie im Fenster "Neues Projekt erstellen" aus der Liste der angezeigten Vorlagen "Konsolen-App (.NET Core)" aus.
  4. Weiter klicken.
  5. Geben Sie im nächsten Fenster "Konfigurieren Sie Ihr neues Projekt" den Namen und den Speicherort für das neue Projekt an.
  6. Klicken Sie auf Erstellen.

Dadurch wird ein neues .NET Core-Konsolenanwendungsprojekt in Visual Studio 2019 erstellt. Dieses Projekt wird in den folgenden Abschnitten dieses Artikels verwendet.

Methoden der Buffer-Klasse in .NET

Die Buffer-Klasse enthält die folgenden Methoden:

  • BlockCopy (Array, Int32, Array, Int32) wird verwendet, um ein Quellarray von einem angegebenen Offset in ein Zielarray mit einem bestimmten Offset zu kopieren.
  • ByteLength (Array) gibt die Gesamtzahl der Bytes in einem Array zurück, dh die Länge des Arrays.
  • GetByte (Array, Int32) wird verwendet, um ein Byte an einer bestimmten Stelle in einem Array abzurufen.
  • SetByte (Array, Int32, Byte) wird verwendet, um ein Byte an einer bestimmten Stelle im Array festzulegen.
  • MemoryCopy (Void *, Void *, Int64, Int64) und MemoryCopy (Void *, Void *, UInt64, UInt64) werden verwendet, um eine Anzahl von Bytes von einer Quelladresse im Speicher an eine andere Adresse zu kopieren.

Verwenden von Arrays und Puffern in C #

Bevor wir mit der Buffer-Klasse und ihren Mitgliedern arbeiten, wollen wir die Array-Klasse untersuchen, die sich auf den System-Namespace bezieht. Die Array-Klasse enthält eine Methode namens Copy (), mit der der Inhalt eines Arrays in ein anderes kopiert werden kann.

Die Buffer-Klasse im System-Namespace enthält eine Methode namens BlockCopy (), die dasselbe tut. Mit BlockCopy () können Sie den Inhalt eines Quellarrays in ein Zielarray kopieren. Es ist zu beachten, dass die Buffer.BlockCopy-Methode viel schneller ist als die Array.Copy-Methode. Die Buffer-Klasse enthält auch andere Methoden wie ByteLength, GetByte und SetByte.

Beachten Sie, dass die BlockCopy-Methode die Elemente eines Quellarrays nicht kopiert. BlockCopy kopiert vielmehr eine Folge von Bytes vom Quellarray in das Zielarray.

Kopieren Sie Bytes zwischen zwei Arrays in C #

Sie können die Buffer.BlockCopy-Methode nutzen, um Bytes zwischen einem Quellarray und einem Zielarray zu kopieren - wie im folgenden Codeausschnitt gezeigt.

statische Leere Main ()

{

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

  short [] arr2 = new short [10];

  int sourceOffset = 0;

  int destinationOffset = 0;

  int count = 2 * sizeof (kurz);

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

  für (int i = 0; i <arr2.Length; i ++)

  {

      Console.WriteLine (arr2 [i]);

  }}

  Console.ReadKey ();

}}

Wenn Sie das obige Programm ausführen, sieht die Ausgabe im Konsolenfenster folgendermaßen aus.

Ermitteln Sie die Bytelänge eines Arrays in C #

Um die Länge eines Arrays herauszufinden, können Sie die ByteLength-Methode der Buffer-Klasse verwenden, wie im folgenden Codebeispiel gezeigt.

statische Leere Main ()

{

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

  short [] arr2 = new short [10];

  Console.WriteLine ("Die Länge von arr1 beträgt: {0}",

  Buffer.ByteLength (arr1));

  Console.WriteLine ("Die Länge des arr2 beträgt: {0}",

  Buffer.ByteLength (arr2));

  Console.ReadKey ();

}}

Wenn Sie das obige Programm ausführen, sieht die Ausgabe folgendermaßen aus:

Mit den SetByte- und GetByte-Methoden der Buffer-Klasse können einzelne Bytes zu bzw. von einem Array festgelegt oder gelesen werden. Das folgende Code-Snipet zeigt, wie die Methoden SetByte und GetByte verwendet werden können.

statische Leere Main ()

{

kurz [] arr1 = {5, 25};

int length = Buffer.ByteLength (arr1);

Console.WriteLine ("\ nDas ursprüngliche Array lautet wie folgt: -");

für (int i = 0; i <Länge; i ++)

{

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

      Console.WriteLine (b);

}}

Buffer.SetByte (arr1, 0, 100);

Buffer.SetByte (arr1, 1, 100);

Console.WriteLine ("\ nDas geänderte Array lautet wie folgt: -");

für (int i = 0; i <Buffer.ByteLength (arr1); i ++)

{

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

      Console.WriteLine (b);

}}

    Console.ReadKey ();

}}

Wenn Sie das obige Programm ausführen, wird die Ausgabe folgendermaßen angezeigt.

Die Buffer-Klasse bietet eine viel bessere Leistung beim Bearbeiten eines Speicherbereichs, der primitive Typen enthält. Sie sollten die Buffer-Klasse immer dann nutzen, wenn Sie Daten im Speicher bearbeiten müssen und wenn Sie schnellen Zugriff auf Daten benötigen, die ebenfalls im Speicher gespeichert sind.

So machen Sie mehr in C #:

  • Verwendung von HashSet in C #
  • Verwendung benannter und optionaler Parameter in C #
  • Benchmarking von C # -Code mit BenchmarkDotNet
  • Verwendung fließender Schnittstellen und Methodenverkettung in C #
  • So testen Sie statische Methoden in C #
  • Wie man Gottobjekte in C # umgestaltet
  • Verwendung von ValueTask in C #
  • Verwendung der Unveränderlichkeit in C.
  • Verwendung von const, readonly und static in C #
  • Verwendung von Datenanmerkungen in C #
  • So arbeiten Sie mit GUIDs in C # 8
  • Wann wird eine abstrakte Klasse im Vergleich zur Schnittstelle in C # verwendet?
  • So arbeiten Sie mit AutoMapper in C #
  • Verwendung von Lambda-Ausdrücken in C #
  • So arbeiten Sie mit Action-, Func- und Predicate-Delegaten in C #
  • So arbeiten Sie mit Delegierten in C #
  • So implementieren Sie einen einfachen Logger in C #
  • So arbeiten Sie mit Attributen in C #
  • So arbeiten Sie mit log4net in C #
  • So implementieren Sie das Repository-Entwurfsmuster in C #
  • Wie man mit Reflexion in C # arbeitet
  • So arbeiten Sie mit dem Dateisystemwatcher in C #
  • So führen Sie eine verzögerte Initialisierung in C # durch
  • So arbeiten Sie mit MSMQ in C #
  • So arbeiten Sie mit Erweiterungsmethoden in C #
  • Wie wir Lambda-Ausdrücke in C #
  • Wann wird das flüchtige Schlüsselwort in C # verwendet?
  • Verwendung des Schlüsselwortsield in C #
  • So implementieren Sie Polymorphismus in C #
  • So erstellen Sie Ihren eigenen Taskplaner in C #
  • So arbeiten Sie mit RabbitMQ in C #
  • So arbeiten Sie mit einem Tupel in C #
  • Erkundung virtueller und abstrakter Methoden in C #
  • Verwendung des Dapper ORM in C #
  • Verwendung des Entwurfsmusters im Fliegengewicht in C #