2

VB6 アプリケーションではDictionary、キーがStrings で値がカスタム クラスのインスタンスである があります。を呼び出すRemoveAll()と、Dictionary最初にカスタム オブジェクトが解放されますか? または、明示的に自分でこれを行う必要がありますか?

Dim d as Scripting.Dictionary

d("a") = New clsCustom
d("b") = New clsCustom

' Are these two lines necessary?
Set d("a") = Nothing
Set d("b") = Nothing

d.RemoveAll
4

3 に答える 3

4

はい、 内のすべてのオブジェクトは、Dictionaryへの呼び出し後に解放されRemoveAll()ます。パフォーマンス (速度など) の観点から、変数を設定するこれらの行は不要であると言えますNothing。これは、コードが最初にキー名に基づいてそれらを検索する必要があるのに対しRemoveAll()、1 つのループですべてを列挙して解放するためです。

于 2008-09-16T17:54:06.490 に答える
2

RemoveAllDictionaryキーと値の両方からすべての関連付けを削除します。Dictionaryの値への参照を保持することは、 の参照リークになりますDictionary

于 2008-09-16T17:54:35.523 に答える
0

コレクション内のアイテムを参照する変数が他にない場合は、それらのオブジェクトをガベージ コレクターに渡して、次に GC を実行するときにクリーンアップする必要があります。

たとえば、sObj が静的変数のどこかでこれを行うと、GC がシステムによって次に呼び出されるときに、最初のオブジェクトはクリーンアップされますが、まだ sObj によって参照されている 2 番目のオブジェクトはクリーンアップされません。

d("a") = New clsCustom
d("b") = New clsCustom code.
sObj = d("b")

d.RemoveAll()
于 2008-09-16T17:58:02.800 に答える