朝会発表テーマ

Nothing の代入について(VB.NETとVB6の違い)

1. VB6からVB.NETにコンバートしたときに起きたコンパイルエラー

Meキーワード

… コードが現在実行されているクラスの特定のインスタンスを参照する。.NETでは変更不可

             (VB6は参考サイトが見つからなかった。今までコンパイルエラーにはなっていない)

My.formsオブジェクト 

… 現在のプロジェクトで宣言されている各Windows フォームのインスタンスにアクセスするための

プロパティを提供するオブジェクト

My.Forms.(フォーム名) = Nothing

「'(フォーム名)’ は、既定のインスタンスからそれ自体を参照できません。’Me’ を使用してください。」

2. VB6とVB.NETの違い

VB6 … オブジェクトに「Nothing」を代入することでオブジェクトのインスタンスを破棄する

       VB6、VBAにはガベージコレクタという考え方がなく、参照がなくなったタイミングでメモリが開放される

.NET … オブジェクトに「Nothing」を代入することで暗黙的にその型の初期値が設定される

ガベージコレクタに回収されやすくなる

3.余談

今まで「garbage collection」をガーベジコレクションと読んでいたが、大体の参考サイトでガベージコレクションと書いてあった。

VB6や.NETのサイトではガベージコレクション、Javaのサイトではガーベジコレクションと呼んでいることが多い気がする。


Nothingの代入が必須のケースもあります。

オブジェクトが互いのオブジェクトを参照している「循環参照」の場合、変数の有効期間が終了してもオブジェクトは破棄されません。

オブジェクトがメモリ上に残り続け、オブジェクトを破棄する際に行われる処理も実行されないままになってしまいます。

この場合は、オブジェクトAからオブジェクトBを参照しているところ(またはその逆)にNothingを代入し、循環参照を断ち切る必要があります。

Meキーワードはクラスまたは構造体の現在のコードが実行されている、特定のインスタンスを参照する方法を提供します。 Me オブジェクト変数または

構造体変数を参照する現在のインスタンスのいずれかのように動作します。 使用してMeはクラスまたは構造体の現在実行中のインスタンスに関する情

報を別のクラス、構造体、またはモジュール内のプロシージャに渡すために特に便利です。

コメント