Какво прави методът FillBuffer на BinaryReader?

Според документацията:

Запълва вътрешния буфер с посочения брой байтове, прочетени от потока.

Какво означава това (какъв е вътрешният буфер?)?


person Alofons    schedule 17.10.2010    source източник


Отговори (3)


BinaryReader има вътрешен буфер, така че не е необходимо да извършва толкова много малки четения на основния поток, особено също и когато чете данни за знаци, които може да се нуждаят от известно гледане напред. Не трябва да се обаждате това ръчно.

person Lucero    schedule 17.10.2010
comment
Така че се чудя защо е защитен вместо частен. - person Alofons; 18.10.2010
comment
Не сте сами: pcreview.co.uk/forums/thread-1225604. php - Предполагам, че първо са искали да улеснят разширяването и след това са спрели наполовина или не са отменили всичко. - person Lucero; 18.10.2010

Забележете, че методът е деклариран като защитен.

Като такъв, той представлява интерес само ако искате да създадете клас, който наследява от BinaryReader, което рядко трябва да правите.

person Lasse V. Karlsen    schedule 17.10.2010
comment
... но дори и тогава е доста безполезно, защото нямате никакъв контрол върху вътрешния буфер, дори когато отменяте този метод. Съгласен съм с Alofons за това. - person Lucero; 18.10.2010
comment
Съгласен съм, няма много смисъл. Мисля, че може да е полезно да можете да извикате това, преди да прочетете голям обект, състоящ се от много по-малки части, като гарантирате, че по средата на четенето на обекта няма да се налага да запълва буфера и по този начин можете да пре -зареждане на буфера. Въпреки това, както казвате, вие нямате контрол върху размера на буфера или каквото и да било наистина, така че най-вероятно това е артефакт на някой, който смята, че класът трябва да бъде разширим, и след това не е завършил работата. - person Lasse V. Karlsen; 18.10.2010

Изглежда, че основната цел тук е да ви позволи да имате удобен метод, за да гарантирате, че разполагате с блок от данни локално; например, когато четете "двойно", бихте (обикновено) искали 8 байта. Този метод завършва:

  • проверка дали вътрешният буфер вече има достатъчно
  • преминавайки през „Четене“, ако е необходимо
  • проверка за EOF (и грешки)
  • охрана за превишаване
  • управление на буфери, като периодично блоково копиране на данните назад или обработка на различните индекси за цикличен буфер

Изглежда обаче малко вероятно да се наложи да го извиквате външно, освен ако не четете малък 'byte[]'

Що се отнася до вътрешния буфер; просто, когато ви десериализира:

  • искате да минимизирате обажданията до „Четене“
  • често трябва да надникнете напред повече от 1 байт (трудно без буфер)
  • редовно искат операции върху малък 'byte[]' (чрез BitConverter, например)

Така че просто работете

person Marc Gravell    schedule 17.10.2010
comment
Знам, че това е малко по-стара публикация, но можете ли да разясните какво имате предвид в последния списък? Пиша EndianAwareBinaryReader и често се обаждам на BitConverter в него. Вижте публикацията ми в този MSDN форма за моето внедряване. - person Scott Chamberlain; 31.10.2011
comment
@Scott, както знаете, байтът [] е преобладаващ в BitConverter. Всичко, което казвам, е: би било добре тези разпределения да бъдат сведени до минимум. Всъщност, в моя собствен сериализатор се опитвам да избегна BitConverter, използвам комбинация от смени и т.н., за да постигна безопасност при крайния ред, и избягване на разпределението на буфера - person Marc Gravell; 31.10.2011