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

ここで、2つの方法に関する良い質問があります

于 2012-10-19T07:51:52.897 に答える
0

マネージ コードのみを記述した場合 (つまり、P/Invoke を使用しない場合)、ガベージ コレクションの問題が発生することは非常にまれです。

多くの賢明な人々はガベージ コレクションを機能させるために多大な努力を払ってきましたが、あなたはそれを気にする必要はありません。コードを書くだけで、理解できない特定の動作に遭遇した場合は、その特定の動作について質問してください (99.9967% [1] のケースではガベージ コレクターではないことを保証できます)。

[1] これは乱数ではありません。私は、プログラミングの約 10 年間に 1 回、ガベージ コレクションの問題に遭遇しました。1 日 10 件のバグと年間 300 日の作業があると仮定すると、29999/30000 件のバグ (ガベージ コレクションに関連しないもの) = 99.9967% になります。

于 2012-10-19T10:34:02.517 に答える