投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/5/25 17:17:30
付け加えるとすれば、
> Dim f As New Form2
> f.ShowDialog()
というコードも適切ではありません。正しくは下記のように書くべきです。
Using f As New Form2()
    f.ShowDialog()
End Using



Show の場合は、子フォームが閉じられた時に、子フォームのインスタンスも Dispose されます。

しかし ShowDialog の場合、子フォームが Close メソッドや呼ばれたり、
右上閉じるボタンが押されたとしても、単に非表示になるだけで
インスタンスは残り続けます。
そのため、インスタンスを生成した側で、明示的に Dispose しなければならないのです。


https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.form.showdialog?view=netframework-4.8
>
> 非モーダルフォームとは異なり、Close メソッドは、ユーザーがダイアログボックスの
> [フォームを閉じる] ボタンをクリックしたとき、または DialogResult プロパティの値を
> 設定したときに .NET Framework によって呼び出されません。 代わりに、フォームは
> 非表示になり、ダイアログボックスの新しいインスタンスを作成せずに再び表示できます。
>
> ダイアログボックスとして表示されるフォームは、Closed ではなく非表示になるため、
> アプリケーションでフォームが不要になったときに、フォームの Dispose メソッドを
> 呼び出す必要があります。
>

VB6 の場合も、Unload しただけではそのフォームのインスタンスは残り続けており、
フィールド変数に引き続きアクセスできましたよね?
内部事情的は少々異なっていますが、それと似たような話だと思ってください。

http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_30162_0.html
https://www.nda.co.jp/memo/event_vb6.html