我有一个带有公共字节数组的类。让我们说它
Public myBuff as byte()
类中的事件获取字节数组中的数据块。我如何告诉事件代码将 get 块放在最后?让我们说
Private Sub GetChunk
Dim chunk as byte
'... get stuff in chunk
Me.myBuff += chunk '(stick chunk on end of public array)
End sub
还是我完全错过了重点?
我有一个带有公共字节数组的类。让我们说它
Public myBuff as byte()
类中的事件获取字节数组中的数据块。我如何告诉事件代码将 get 块放在最后?让我们说
Private Sub GetChunk
Dim chunk as byte
'... get stuff in chunk
Me.myBuff += chunk '(stick chunk on end of public array)
End sub
还是我完全错过了重点?
如果数组很小,并且很少添加新数据,那么一种简单的方法是:
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
如果 chunk 是一个字节数组,它看起来更像:
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 的内存加倍。这意味着更少的内存洗牌。
如果我没记错的话,在vb中你想用preserve来redim来增长一个数组。
您将不断使用 ReDim 关键字,这是非常低效的。
你在使用.Net吗?如果是这样,请考虑改用 System.Collections.Generic.List(Of Byte)。你可以使用它的 .AddRange() 方法来追加你的字节,如果你真的需要一个数组,它的 .ToArray() 方法可以取出一个数组。
你的问题似乎不是很清楚。您可能不应该公开字节数组。它可能应该是私有的,并且您应该提供一组公共函数,允许该类的用户对数组执行操作。
我认为您可能正在寻找除数组之外的其他东西。如果您试图频繁地逐步扩展数据量,则应使用动态数据结构,例如ArrayList
. 这有一个Add
方法可以将特定对象或值添加到数组中,而不用担心空间。它还有一个ToArray()
你可以使用的漂亮方法。
如果您出于特定原因(我猜是性能)尝试使用数组,请使用ReDim Preserve array(newSize)
.