2

我正在从 SQLite 数据库/记录集中检索字节 blob。我还没有垃圾收集的经验。

当我说:

Dim bt() As Byte
bt = r.fields("mybyteblob").value

……这还好还是不安全?

我想在记录集字段中复制字节数组,我不确定我是否只是在这里引用字节数组而不是复制它。

4

2 回答 2

3

在您的代码中,您仅引用字节数组。
如果你想复制它,你需要

Dim bt() As Byte 
if r.fields("mybyteblob").Value Is not Nothing then 
    dim lenArray = r.fields("mybyteblob").Length
    bt = new Byte(lenArray)
    Array.Copy(r.fields("mybyteblob").value, bt, lenArray)
end if

还有另一种选择。
Buffer 类比 Array 更快并且更合适,因为您使用的是字节数组

Dim bt() As Byte 
if r.fields("mybyteblob").Value Is not Nothing then 
    dim lenArray = r.fields("mybyteblob").Length
    bt = new Byte(lenArray)
    Buffer.BlockCopy(r.fields("mybyteblob").value, 0, bt, 0, lenArray)
end if

这是关于这两种方法的一个很好的问题

于 2012-10-19T07:51:52.897 回答
0

如果您只编写托管代码(即没有 P/Invoke),那么遇到垃圾收集问题是非常罕见的。

许多聪明的人已经付出了很多努力来让垃圾收集工作而不用担心它,所以就这样做吧:不用担心。只需编写代码,如果遇到不理解的特定行为,请询问该特定行为(我可以向您保证,在 99.9967% [1] 的情况下,它不会是垃圾收集器)。

[1] 这不是一个随机数。在大约 10 年的编程中,我遇到过一次垃圾收集问题。假设每天有 10 个错误,每年工作 300 天,那么与垃圾收集无关的错误为 29999/30000 个 = 99.9967%。

于 2012-10-19T10:34:02.517 回答