C#でBufferクラスを使用する方法

バッファはメモリ内のバイトのシーケンスであり、バッファリングはメモリ内にあるデータの操作です。.NETでは、バッファリングとは、バイトの配列として表されるアンマネージメモリの操作を指します。 

データをメモリに直接書き込む必要がある場合、またはアンマネージメモリに格納されているデータを操作する場合は、.NETのSystem.Bufferクラスを利用することをお勧めします。この記事では、C#でBufferクラスを操作する方法について説明します。 

この記事で提供されているコード例を使用するには、システムにVisual Studio2019がインストールされている必要があります。まだコピーをお持ちでない場合は、こちらからVisual Studio2019をダウンロードできます。

VisualStudioで.NETCoreコンソールアプリケーションプロジェクトを作成します

まず、VisualStudioで.NETCoreコンソールアプリケーションプロジェクトを作成しましょう。Visual Studio 2019がシステムにインストールされていると仮定して、以下に概説する手順に従って、VisualStudioで新しい.NETCoreコンソールアプリケーションプロジェクトを作成します。

  1. Visual StudioIDEを起動します。
  2. 「新しいプロジェクトの作成」をクリックします。
  3. 「新規プロジェクトの作成」ウィンドウで、表示されたテンプレートのリストから「コンソールアプリ(.NETCore)」を選択します。
  4. [次へ]をクリックします。
  5. 次に表示される[新しいプロジェクトの構成]ウィンドウで、新しいプロジェクトの名前と場所を指定します。
  6. [作成]をクリックします。

これにより、Visual Studio2019で新しい.NETCoreコンソールアプリケーションプロジェクトが作成されます。このプロジェクトは、この記事の後続のセクションで使用します。

.NETのBufferクラスのメソッド

Bufferクラスには、次のメソッドが含まれています。

  • BlockCopy(Array、Int32、Array、Int32)は、指定されたオフセットから指定されたオフセットのターゲット配列にソース配列をコピーするために使用されます。
  • ByteLength(Array)は、配列内の合計バイト数、つまり配列の長さを返します。
  • GetByte(Array、Int32)は、配列内の指定された場所にあるバイトを取得するために使用されます。
  • SetByte(Array、Int32、Byte)は、配列内の特定の場所にバイトを設定するために使用されます。
  • MemoryCopy(Void *、Void *、Int64、Int64)およびMemoryCopy(Void *、Void *、UInt64、UInt64)は、メモリ内の送信元アドレスから別のアドレスにバイト数をコピーするために使用されます。

C#で配列とバッファーを使用する

Bufferクラスとそのメンバーの操作を開始する前に、System名前空間に関連するArrayクラスについて調べてみましょう。Arrayクラスには、ある配列の内容を別の配列にコピーするために使用できるCopy()という名前のメソッドが含まれています。

System名前空間のBufferクラスには、同じことを行うBlockCopy()という名前のメソッドが含まれています。BlockCopy()を使用して、ソース配列の内容を宛先配列にコピーできます。Buffer.BlockCopyメソッドはArray.Copyメソッドよりもはるかに高速であることに注意してください。Bufferクラスには、ByteLength、GetByte、SetByteなどの他のメソッドも含まれています。

BlockCopyメソッドはソース配列の要素をコピーしないことに注意してください。むしろ、BlockCopyは、バイトのシーケンスをソース配列から宛先配列にコピーします。

C#の2つの配列間でバイトをコピーする

以下に示すコードスニペットに示すように、Buffer.BlockCopyメソッドを利用して、ソース配列と宛先配列の間でバイトをコピーできます。

static void 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(short);

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

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

  {{

      Console.WriteLine(arr2 [i]);

  }

  Console.ReadKey();

}

上記のプログラムを実行すると、出力がコンソールウィンドウでどのように表示されるかを次に示します。

C#で配列のバイト長を見つける

配列の長さを調べるには、以下のコード例に示すように、BufferクラスのByteLengthメソッドを利用できます。

static void Main()

{{

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

  short [] arr2 = new short [10];

  Console.WriteLine( "arr1の長さは次のとおりです:{0}"、

  Buffer.ByteLength(arr1));

  Console.WriteLine( "arr2の長さは次のとおりです:{0}"、

  Buffer.ByteLength(arr2));

  Console.ReadKey();

}

上記のプログラムを実行すると、出力は次のようになります。

BufferクラスのSetByteメソッドとGetByteメソッドを使用して、配列との間でそれぞれ個別のバイトを設定または読み取ることができます。次のコードスニペットは、SetByteメソッドとGetByteメソッドの使用方法を示しています。

static void Main()

{{

short [] arr1 = {5、25};

int length = Buffer.ByteLength(arr1);

Console.WriteLine( "\ n元の配列は次のとおりです:-");

for(int i = 0; i <長さ; i ++)

{{

      バイトb = Buffer.GetByte(arr1、i);

      Console.WriteLine(b);

}

Buffer.SetByte(arr1、0、100);

Buffer.SetByte(arr1、1、100);

Console.WriteLine( "\ n変更された配列は次のとおりです:-");

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

{{

      バイトb = Buffer.GetByte(arr1、i);

      Console.WriteLine(b);

}

    Console.ReadKey();

}

上記のプログラムを実行すると、出力は次のように表示されます。

Bufferクラスは、プリミティブ型を含むメモリ領域を操作するときに、はるかに優れたパフォーマンスを提供します。メモリ内のデータを操作する必要があるとき、およびメモリに格納されているデータに高速にアクセスする必要があるときはいつでも、Bufferクラスを利用する必要があります。

C#でさらに多くのことを行う方法:

  • C#でHashSetを使用する方法
  • C#で名前付きパラメーターとオプションのパラメーターを使用する方法
  • BenchmarkDotNetを使用してC#コードをベンチマークする方法
  • C#で流暢なインターフェイスとメソッドチェーンを使用する方法
  • C#で静的メソッドを単体テストする方法
  • C#で神オブジェクトをリファクタリングする方法
  • C#でValueTaskを使用する方法
  • Cで不変性を使用する方法
  • C#でconst、readonly、staticを使用する方法
  • C#でデータ注釈を使用する方法
  • C#8でGUIDを操作する方法
  • C#で抽象クラスとインターフェイスを使用する場合
  • C#でAutoMapperを操作する方法
  • C#でラムダ式を使用する方法
  • C#でAction、Func、およびPredicateデリゲートを操作する方法
  • C#でデリゲートを操作する方法
  • C#で簡単なロガーを実装する方法
  • C#で属性を操作する方法
  • C#でlog4netを操作する方法
  • C#でリポジトリデザインパターンを実装する方法
  • C#でリフレクションを操作する方法
  • C#でfilesystemwatcherを操作する方法
  • C#でレイジー初期化を実行する方法
  • C#でMSMQを操作する方法
  • C#で拡張メソッドを操作する方法
  • C#でラムダ式を使用する方法
  • C#でvolatileキーワードを使用する場合
  • C#でyieldキーワードを使用する方法
  • C#でポリモーフィズムを実装する方法
  • C#で独自のタスクスケジューラを構築する方法
  • C#でRabbitMQを操作する方法
  • C#でタプルを操作する方法
  • C#での仮想メソッドと抽象メソッドの調査
  • C#でDapperORMを使用する方法
  • C#でフライウェイトデザインパターンを使用する方法