我正在从 SQLite 数据库/记录集中检索字节 blob。我还没有垃圾收集的经验。
当我说:
Dim bt() As Byte
bt = r.fields("mybyteblob").value
……这还好还是不安全?
我想在记录集字段中复制字节数组,我不确定我是否只是在这里引用字节数组而不是复制它。
我正在从 SQLite 数据库/记录集中检索字节 blob。我还没有垃圾收集的经验。
当我说:
Dim bt() As Byte
bt = r.fields("mybyteblob").value
……这还好还是不安全?
我想在记录集字段中复制字节数组,我不确定我是否只是在这里引用字节数组而不是复制它。
在您的代码中,您仅引用字节数组。
如果你想复制它,你需要
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
这是关于这两种方法的一个很好的问题
如果您只编写托管代码(即没有 P/Invoke),那么遇到垃圾收集问题是非常罕见的。
许多聪明的人已经付出了很多努力来让垃圾收集工作而不用担心它,所以就这样做吧:不用担心。只需编写代码,如果遇到不理解的特定行为,请询问该特定行为(我可以向您保证,在 99.9967% [1] 的情况下,它不会是垃圾收集器)。
[1] 这不是一个随机数。在大约 10 年的编程中,我遇到过一次垃圾收集问题。假设每天有 10 个错误,每年工作 300 天,那么与垃圾收集无关的错误为 29999/30000 个 = 99.9967%。