<Attention>
その1に載せたコードを前提に書いています。
</Attention>
前回の 'その3' ではForm1 は Form クラスを継承していて、InitializeComponent メソッドはボタンやらを初期化してましたよ~って感じでした。
今回は components という変数とDispose メソッドについてです。まずは components という変数から。宣言はどうなっているかといいますと・・・
Private components As System.ComponentModel.IContainer
IContainer インターフェイス になっていますね。いつもどおりMSDNを。
MSDN:IContainer インターフェイス(http://msdn2.microsoft.com/ja-jp/library/system.componentmodel.icontainer(VS.80).aspx)より。
コンテナの機能を提供します。コンテナとは、論理上 0 個以上のコンポーネントを格納しているオブジェクトです。
しかし MSDN ってURLが直感的でいいですね。
インスタンスの初期化はどうなっているかといいますと・・・
components = New System.ComponentModel.Container()
System.ComponentModel.Container になっていますね。これもMSDNを。
MSDN:Container クラス(http://msdn2.microsoft.com/ja-jp/library/system.componentmodel.container(VS.80).aspx)より。
0 個以上のコンポーネントをカプセル化します。
要するにコンテナなんですね。とはいえこの変数、ぢつは Form1.Designer.vb が生成されたときはなんにもしてません。前回も書きましたが Button を一個配置しただけで消えちゃいます(これホントに不思議)。じゃ、どんなときに使われるのかというと、たとえば、デザイナで BindingSource クラスを Form1 に配置してみてください。BindingSource1 が配置されると思いますが、このとき InitializeComponent メソッドがこう↓なります。
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container
Me.BindingSource1 = New System.Windows.Forms.BindingSource(Me.components)
CType(Me.BindingSource1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(292, 269)
Me.Name = "Form1"
Me.Text = "Form1"
CType(Me.BindingSource1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
この中に以下のコードがあります。
Me.BindingSource1 = New System.Windows.Forms.BindingSource(Me.components)
BindingSource1 のインスタンスを初期化するときに components がパラメータとして渡されています。何してるんでしょうか・・・?
とりあえず BindingSource クラスを調べてみましょう。もちろん MSDN で!
MSDN:BindingSource クラス(http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.bindingsource(VS.80).aspx)
そのコンストラクタはというと、
MSDN:BindingSource コンストラクタ (IContainer) (http://msdn2.microsoft.com/ja-jp/library/ms158149(VS.80).aspx)より。
BindingSource クラスの新しいインスタンスを初期化し、その BindingSource を指定したコンテナに追加します。
つまりインスタンスを初期化した後、パラメータに渡されたコンテナに自身を追加する、といった動作をしています。コンテナでこのインスタンスを参照しておこうってことですね。
さて、これはどういった目的からでしょうか?なんの役に立つのでしょう?ここで Dispose メソッド です。
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
Dispose メソッド(IDisposable.Dispose)自体についてはたくさんの議論やエントリを見ることができます。興味ある方は検索しまくってください。ここでは Form1 のDispose メソッドについて書きますね。
上記のコードを見てみると、内部でcomponents.Dispose()が呼ばれています。MSDN によると
MSDN:Container.Dispose メソッド(http://msdn2.microsoft.com/ja-jp/library/system.componentmodel.container.dispose(VS.80).aspx)より。
Container によって使用されているリソースを解放します。
「Container によって使用されているリソースを解放します」ってことは、components に追加されたインスタンスのリソースもきっと解放されてるんじゃないでしょうか。(憶測です。)
とまぁ、このあたりのデザイナでの動きもちゃんとお世話してくれているんでしょうね。
今回はさっくりと書きなぐっただけですがここで筆をおきます。もう少し続きそうですが。