У меня есть класс с публичным массивом байтов. Скажем так
Public myBuff as byte()
События внутри класса получают фрагменты данных в байтовом массиве. Как сообщить коду события, чтобы он вставлял блок данных в конец? Скажем так
Private Sub GetChunk
Dim chunk as byte
'... get stuff in chunk
Me.myBuff += chunk '(stick chunk on end of public array)
End sub
Или я совершенно упустил суть?



если я правильно помню, в vb вы хотите изменить с сохранением для роста массива.
ReDim Сохранить ваш массив (новый размер)
Вы будете постоянно использовать ключевое слово ReDim, которое очень сильно неэффективно.
Вы используете .Net? В таком случае рассмотрите возможность использования вместо этого System.Collections.Generic.List (Of Byte). Вы можете использовать метод .AddRange () для добавления ваших байтов и метод .ToArray (), чтобы вернуть массив, если он вам действительно нужен.
List (Of Byte), похоже, имеет некоторые ограничения по размеру. Он не может превышать определенный порог, в отличие от ArrayList.
Свойства Count и Capacity в List (Of Byte) являются Int32, как и ArrayList. ArrayList будет упаковывать каждый байт, который вы в него помещаете, добавляя массу сборщика мусора и накладных расходов на память. Возможно, вы столкнулись с проблемой фрагментации виртуальной памяти? Редко можно получить 2 ГБ бесплатного блока виртуальной машины.
Я так не верю. Я все это делал на коробке x64. Arraylist увеличил размер примерно до 3,5 ГБ, прежде чем я его убил, в то время как List умер примерно до 900 МБ.
Ваш вопрос кажется не очень ясным. Вероятно, вам не следует иметь массив байтов как общедоступный. Вероятно, он должен быть частным, и вы должны предоставить набор общедоступных функций, которые позволяют пользователям класса выполнять операции с массивом.
Я думаю, вы могли бы искать что-то другое, кроме массива. Если вы часто пытаетесь постепенно увеличивать объем данных, вам следует использовать динамическую структуру данных, такую как ArrayList. У этого есть метод Add, который добавляет конкретный объект или значение в массив, не беспокоясь о пространстве. У него также есть изящный метод ToArray(), который вы можете использовать.
Если вы пытаетесь использовать массив по определенным причинам (я думаю, производительность), используйте ReDim Preserve array(newSize).
Если массив небольшой и новые данные добавляются нечасто, простой способ:
public BufferSize as long 'or you can just use Ubound(mybuff), I prefer a tracker var tho
public MyBuff
private sub GetChunk()
dim chunk as byte
'get stuff
BufferSize=BufferSize+1
redim preserve MyBuff(buffersize)
mybuff(buffersize) = chunk
end sub
если чанк представляет собой массив байтов, он будет выглядеть примерно так:
buffersize=buffersize+ubound(chunk) 'or if it's a fixed-size chunk, just use that number
redim preserve mybuff(buffersize)
for k%=0 to ubound(chunk) 'copy new information to buffersize
mybuff(k%+buffersize-ubound(chunk))=chunk(k%)
next
если вы будете делать это часто (скажем, много раз в секунду), вы захотите сделать что-то вроде того, как работает класс StringBuilder:
public BufSize&,BufAlloc& 'initialize bufalloc to 1 or a number >= bufsize
public MyBuff() as byte
sub getdata()
bufsize=bufsize+ubound(chunk)
if bufsize>bufalloc then
bufalloc=bufalloc*2
redim preserve mybuff(bufalloc)
end if
for k%=0 to ubound(chunk) 'copy new information to buffersize
mybuff(k%+bufsize-ubound(chunk))=chunk(k%)
next
end sub
это в основном удваивает память, выделенную для mybuf, каждый раз, когда указатель проходит конец буфера. это означает гораздо меньше перетасовки памяти.
но можете ли вы сделать это с массивом, определенным как общедоступный элемент в классе? то есть можете ли вы использовать зарезервированные слова piblic и redim вместе?