Как да използвам клас Buffer в C #

Буферът е последователност от байтове в паметта, а буферирането е манипулиране на данни, намиращи се в паметта. В .NET буферирането се отнася до манипулацията на неуправляемата памет, която е представена като масив от байтове. 

Може да искате да се възползвате от класа System.Buffer в .NET всеки път, когато трябва да записвате данни директно в паметта или когато искате да манипулирате данни, съхранявани в неуправляема памет. Тази статия разказва за това как можем да работим с класа Buffer в C #. 

За да работите с примерите за кодове, предоставени в тази статия, трябва да имате Visual Studio 2019 инсталиран във вашата система. Ако все още нямате копие, можете да изтеглите Visual Studio 2019 тук.

Създайте проект за приложение на конзола .NET Core в Visual Studio

Първо, нека създадем проект за приложение на конзола .NET Core в Visual Studio. Ако приемем, че Visual Studio 2019 е инсталиран във вашата система, следвайте стъпките, описани по-долу, за да създадете нов проект за приложение на конзола .NET Core в Visual Studio.

  1. Стартирайте Visual Studio IDE.
  2. Кликнете върху „Създаване на нов проект“.
  3. В прозореца „Създаване на нов проект“ изберете „Console App (.NET Core)“ от показания списък с шаблони.
  4. Щракнете върху Напред.
  5. В показания след това прозорец „Конфигуриране на вашия нов проект“ посочете името и местоположението на новия проект.
  6. Щракнете върху Създаване.

Това ще създаде нов проект за приложение на конзола .NET Core в Visual Studio 2019. Ще използваме този проект в следващите раздели на тази статия.

Методи от клас Buffer в .NET

Класът 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 и неговите членове, нека разгледаме класа Array, отнасящ се до пространството от имена System. Класът Array съдържа метод с име Copy (), който може да се използва за копиране на съдържанието на един масив в друг.

Класът Buffer в системното пространство на имена съдържа метод, наречен BlockCopy (), който прави същото. Можете да използвате BlockCopy (), за да копирате съдържанието на масив източник в целеви масив. Трябва да се отбележи, че методът Buffer.BlockCopy е много по-бърз от метода Array.Copy. Класът Buffer съдържа и други методи като ByteLength, GetByte и SetByte.

Имайте предвид, че методът BlockCopy не копира елементите на масив източник. По-скоро BlockCopy копира поредица от байтове от масива източник в целевия масив.

Копиране на байтове между два масива в C #

Можете да се възползвате от метода Buffer.BlockCopy, за да копирате байтове между масива източник и целевия масив - както е показано в кодовия фрагмент, даден по-долу.

статична празнота Главна ()

{

  късо [] arr1 = ново кратко [] {1, 2, 3, 4, 5};

  късо [] arr2 = ново кратко [10];

  int sourceOffset = 0;

  int destinationOffset = 0;

  int count = 2 * sizeof (кратко);

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

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

  {

      Console.WriteLine (arr2 [i]);

  }

  Console.ReadKey ();

}

Когато изпълнявате горната програма, ето как ще изглежда изходът в прозореца на конзолата.

Намерете байтовата дължина на масив в C #

За да разберете дължината на масив, можете да се възползвате от метода ByteLength на класа Buffer, както е показано в примера на кода, даден по-долу.

статична празнота Главна ()

{

  късо [] arr1 = ново кратко [] {1, 2, 3, 4, 5};

  късо [] arr2 = ново кратко [10];

  Console.WriteLine ("Дължината на arr1 е: {0}",

  Buffer.ByteLength (arr1));

  Console.WriteLine ("Дължината на arr2 е: {0}",

  Buffer.ByteLength (arr2));

  Console.ReadKey ();

}

Когато стартирате горната програма, ето как би изглеждал изходът:

Методите SetByte и GetByte от класа Buffer могат да се използват за задаване или четене на отделни байтове съответно към и от масив. Следният кодов фрагмент илюстрира как могат да се използват методите SetByte и GetByte.

статична празнота Главна ()

{

кратко [] arr1 = {5, 25};

int дължина = Buffer.ByteLength (arr1);

Console.WriteLine ("\ nОригиналният масив е както следва: -");

за (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Модифицираният масив е както следва: -");

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

{

      байт b = Buffer.GetByte (arr1, i);

      Console.WriteLine (b);

}

    Console.ReadKey ();

}

Когато изпълнявате горната програма, ето как ще се появи изходът.

Класът Buffer осигурява много по-добра производителност при манипулиране на регион памет, който съдържа примитивни типове. Трябва да се възползвате от класа Buffer, когато трябва да манипулирате данни в паметта и винаги, когато имате нужда от бърз достъп до данни, съхранявани в паметта.

Как да направите повече в C #:

  • Как да използвам HashSet в C #
  • Как да използваме имена и незадължителни параметри в C #
  • Как да сравняваме C # кода с помощта на BenchmarkDotNet
  • Как да използвам плавни интерфейси и вериги на методи в C #
  • Как да тествате статични методи в C #
  • Как да рефакторирам Бог обекти в C #
  • Как да използвам ValueTask в C #
  • Как да използваме неизменност в C
  • Как да използвам const, readonly и static в C #
  • Как да използвам анотации на данни в C #
  • Как да работите с GUID в C # 8
  • Кога да се използва абстрактен клас срещу интерфейс в C #
  • Как да работя с AutoMapper в C #
  • Как да използвам ламбда изрази в C #
  • Как да работя с Action, Func и Predicate делегати в C #
  • Как да работя с делегати в C #
  • Как да внедрите прост регистратор в C #
  • Как да работя с атрибути в C #
  • Как да работя с log4net в C #
  • Как да приложим шаблона за проектиране на хранилището в C #
  • Как да работя с отражение в C #
  • Как да работя с файлова система за наблюдение в C #
  • Как да извършите мързелива инициализация в C #
  • Как да работите с MSMQ в C #
  • Как да работя с методи за разширение в C #
  • Как да използваме ламбда изрази в C #
  • Кога да се използва летливата ключова дума в C #
  • Как да използвам ключовата дума yield в C #
  • Как да приложим полиморфизъм в C #
  • Как да изградите свой собствен планировчик на задачи в C #
  • Как да работя с RabbitMQ в C #
  • Как да работите с кортеж в C #
  • Проучване на виртуални и абстрактни методи в C #
  • Как да използваме Dapper ORM в C #
  • Как да използвам шаблона за дизайн на мухата в C #