- PR -

VB.NETのインスタンス削除必要性に関しての質問

1
投稿者投稿内容
Nira
会議室デビュー日: 2003/08/23
投稿数: 15
投稿日時: 2003-08-23 02:44
お世話になります。VB.NET初心者です。
ファイルサイズをリアルタイムに表示したいのですが、下記4行目の様にイベント内でFileInfoクラスのインスタンスを作成した場合、イベント終了時にインスタンスは自動的に削除又はガーベージコレクションに削除登録されるのでしょうか?
それともオブジェクト参照しないとして明示的に8行目の様にnothingを代入した方が良いのでしょうか?

1: Public strFileName as String
2: Protected Sub Timer1_Tick(ByVal sender As Object, ByVal e As _
3: System.EventArgs) Handles Timer1.Tick
4: Dim fi As New System.IO.FileInfo(strFileName)
5: 'ファイルのサイズを取得
6: Dim l As Long = fi.Length
7: Lavel1.Text = CStr(l)
8: fi = nothing '<--- 必要 ???
9: End Sub
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-23 04:37
引用:

ファイルサイズをリアルタイムに表示したいのですが、下記4行目の様にイベント内でFileInfoクラスのインスタンスを作成した場合、イベント終了時にインスタンスは自動的に削除又はガーベージコレクションに削除登録されるのでしょうか?
それともオブジェクト参照しないとして明示的に8行目の様にnothingを代入した方が良いのでしょうか?

1: Public strFileName as String
2: Protected Sub Timer1_Tick(ByVal sender As Object, ByVal e As _
3: System.EventArgs) Handles Timer1.Tick
4: Dim fi As New System.IO.FileInfo(strFileName)
5: 'ファイルのサイズを取得
6: Dim l As Long = fi.Length
7: Lavel1.Text = CStr(l)
8: fi = nothing '<--- 必要 ???
9: End Sub


メソッド内部で宣言した「変数」は、メソッドを抜けると消滅します。
つまり、この変数が指していた参照はその時点でなくなりますので、Nothingを代入するのと結局は同じことになります。

ただし、IDisposableを実装しているクラスに関しては、通常は使い終わると明示的に破棄する必要があります。この場合はDisposeメソッド(または代わりに提供されている破棄用メソッド)を呼び出します(C# なら using を使う場合もあります)。

通常、ある時点で明示的にNothingに設定しなければならない理由がなければ、明示的にNothingを代入する必要はありません。
Nira
会議室デビュー日: 2003/08/23
投稿数: 15
投稿日時: 2003-08-24 00:04
解答有難う御座いました。

確認ですが、メッソド内で宣言した参照変数が消滅する亊によりインスタンスも.NET Frameworkのガーベージコレクション機能により消滅すると考えて良いのでしょうか?

それとも、メソッド内で作成したインスタンスはメソッド内でのみ有効であるためメソッドの消滅とともにインスタンスも消滅すると考えた方が良いのでしょうか?

もし前者が正しいとすれば、.NET Framework上で動作するVBでガーベージコレクションが働くということは、.NET Framework上で動作するVC++でもガーベージコレクションが働くのでしょうか?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-24 00:38
引用:

確認ですが、メッソド内で宣言した参照変数が消滅する亊によりインスタンスも.NET Frameworkのガーベージコレクション機能により消滅すると考えて良いのでしょうか?


はい、ただし、メッソド内で宣言した参照変数が消滅する亊が、インスタンス消滅の直接のきっかけになるわけではありません。単に、次回のガーベジコレクション時に削除できる状態になるだけです(有効な参照がない状態というだけです)。
有効な参照が一つも無い状態のオブジェクト(表現が厳密ではありませんが)は、次回ガーベジコレクションが発生した際に削除されます(Finalizeをオーバーライドしている場合はちょっと異なりますが)。
引用:

もし前者が正しいとすれば、.NET Framework上で動作するVBでガーベージコレクションが働くということは、.NET Framework上で動作するVC++でもガーベージコレクションが働くのでしょうか?


C++の場合は、多分これまでのC++と同様の記述を行った場合は、ガベージコレクションの対象にならないはずです。CLRに管理されるオブジェクトを作成する場合は、何か明示的に指定等が必要だったはずです(私は良く知りません)。

基本的にはC++がやや特殊であり、普通に.NET Framework上で動作するコードを作成できる言語なら、普通はガベージコレクションは有効がなります。
# 言語の違いは、基本的にはコンパイル時だけの違いです。
Nira
会議室デビュー日: 2003/08/23
投稿数: 15
投稿日時: 2003-08-24 22:37
> なちゃ樣
親切にご解答頂き有難う御座いました。.NETに関して理解を深める亊が出来ました。どうもです。
1

スキルアップ/キャリアアップ(JOB@IT)