CollectionオブジェクトのAddメソッドがしていることはなんですか?

解決


Surari  2006-06-07 14:27:24  No: 95669

始めまして、超初心者で申し訳ありません。教えて下さい。

言語:VB6

以下のようなソースがあり、疑問に思ったことがあります。

CollectionオブジェクトのAddメソッドは、
値をコピーしているのでしょうか?

 Set obj = Nothing

と最後にあるのですが、これをしてしまったら、
Collectionに何が格納されるのか、不思議に思いました。

CollectionオブジェクトのAddメソッドは
どのような動作をしているのでしょうか、??

        Dim col As Collection
        Dim obj As clsSample

        Set col = New Collection
        Set obj = New clsSample
        
        obj.FieldName = "AAA"
        obj.Value = "0001"
        
        Call col.Add(obj, obj.FieldName)
        
        Set obj = Nothing


魔界の仮面弁士  2006-06-07 15:07:36  No: 95670

> CollectionオブジェクトのAddメソッドは、
> 値をコピーしているのでしょうか?

単純な数値等であれば、値そのものがコピーされます。

オブジェクトの場合は、オブジェクトのコピーではなく、
オブジェクトへの参照がコピーされます。


>  Set obj = Nothing
この時点で、コレクションが保持していた値やオブジェクトも参照されなくなります。
そのオブジェクトが、どこからも参照されなくなった場合、オブジェクト自体が破棄されます。


たとえば、
=======  Class1 ========
  Option Explicit
  Private Sub Class_Initialize()
    Debug.Print "<作成>ID:"; ObjPtr(Me)
  End Sub
  Private Sub Class_Terminate()
    Debug.Print "<破棄>ID:"; ObjPtr(Me)
  End Sub
===============
を作っておいた場合、
  Debug.Print "--- Begin ---"
  Set C = New Collection
  Debug.Print "--- Create ---"
  Set Item = New Class1
  Debug.Print "--- Add ---"
  C.Add Item
  Debug.Print "--- Add & Create ---"
  C.Add New Class1
  Debug.Print "--- Nothing ---"
  Set C = Nothing
  Debug.Print "--- Release ---"
  Set Item = Nothing
  Debug.Print "--- End ---"
===============
というコードは、たとえば以下のような結果となります。

--- Begin ---
--- Create ---
<作成>ID: 2294536 
--- Add ---
--- Add & Create ---
<作成>ID: 2255296 
--- Nothing ---
<破棄>ID: 2255296 
--- Release ---
<破棄>ID: 2294536 
--- End ---


Surari  2006-06-07 17:08:56  No: 95671

魔界の仮面弁士様

ありがとうございました。

>オブジェクトへの参照がコピーされます。

コレクションオブジェクトにAddした時点で
コレクションオブジェクトがそのオブジェクトを参照する、
という考え方で、正しいでしょうか?

>そのオブジェクトが、どこからも参照されなくなった場合、オブジェクト自体が破棄されます。

また、仮にプログラムが常駐型だった場合、
コレクションからの参照を解放しても『Set obj = Nothing』を
記述し忘れた場合は、参照が残ってしまい、
メモリ上にオブジェクトは残ってしまう
という考え方で、正しいでしょうか?

再度の質問で恐縮ですが、お返事頂ければ、幸いです。


魔界の仮面弁士  2006-06-07 19:45:25  No: 95672

> コレクションオブジェクトにAddした時点で
> コレクションオブジェクトがそのオブジェクトを参照する、
> という考え方で、正しいでしょうか?
正しいと思います。

Collection に Add しようと、他のオブジェクト変数に Set しようと、
オブジェクト参照の保持という点では、動作的にはかわりません。


> また、仮にプログラムが常駐型だった場合、
この場合の『常駐型』というのは、どのような意味でしょうか?


> コレクションからの参照を解放しても『Set obj = Nothing』を
> 記述し忘れた場合は、参照が残ってしまい、
というわけではありません。(まぁ、あながち間違いとも言えないのですが)

Nothing を代入するかどうかというのは、解放処理とは直接関係ありません。

最終的に、そのオブジェクトが「どこからも参照されなくなった時」に、
オブジェクトが解放される、というのが ActiveX オブジェクトの原則です。
ですからたとえば、下記のように Nothing 無しで解放される事もあるわけです。

Option Explicit

Private Sub Alpha()
    Dim C As Object
    Set C = New Class1
    Set C = Nothing '……この行の実行後、Class1 は解放される
End Sub

Private Sub Beta()
    Dim C As Object
    Set C = New Class1
End Sub '………………この行の実行後、Class1 は解放される

Private Sub Gamma()
    Dim C As Object
    Set C = New Class1
    Set C = Err '……この行の実行後、Class1 は解放される
End Sub

Private Sub Command1_Click()
    Alpha
    Beta
    Gamma
End Sub


Surari  2006-06-12 10:28:31  No: 95673

お返事が遅くなり申し訳ありません。

そのオブジェクトが「どこからも参照されなくなった時」
がポイントですね。

なんとなく、自分の中で整理がつきました。。
ありがとうございました。


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加