2016-12-11 24 views
-2

以下に示すようにVisual StudioでのデフォルトのC#のテンプレートと同じように、私は静的オブジェクトとしてWindows Formを定義しました:静的オブジェクト内で定義された非静的オブジェクトを処分する必要はありますか?

public static FormMain formMain; 

static void Main() 
{ 
    formMain = new FormMain(); 
    Application.Run(formMain); 
    formMain.Dispose(); 
} 

あなたが見ることができるように、私は(newを使用して)メモリ空間を割り当てられましたこの静的フォームを呼び出してから、フォームが閉じられた後でメモリを解放します(Disposeを使用)。以下に示すように

しかし、この静的なフォーム内に、私は、非静的オブジェクト(たとえば、ラベル)のカップルを定義しました:

public FormMain() 
{ 
    // some code here 
    Label myLabel1 = new Label(); 
    Label myLabel2 = new Label(); 
    Label myLabel3 = new Label(); 
    // some code here 
} 

今、私は2つの質問をしました

  1. Disposeこれらの非静的オブジェクトにも、またはformMain.Dispose();行が呼び出されるとすぐにそれらが廃棄される(メモリが解放される)必要がありますか?

  2. 私は、これらの非静的オブジェクトを配置する必要がある場合は、プログラムのどの段階で私は(FormClosingイベントFormClosedにまたはで、など)Disposeを使用することを好むでしょうか?

:私は、Visual Studioでフォームデザイン機能を使用しないようにしよう、しかしラインでフォームのラインをコーディングすることを好みます。 Visual StudioでのデフォルトのC#のテンプレートのように

+1

Application.Runは、この例のフォームを既に破棄しています。「FormクラスのDisposeメソッドは、[Application.Run]メソッドが返される前に呼び出されます。 – user2864740

+0

私はフォームについて尋ねるのではなく、フォーム内で定義された非静的オブジェクト( 'myLabel1'、' myLabel2'など)を要求しています。 – ssd

+1

'FormMain'は、作成したメンバ変数を破棄する必要があります。 FormMainが静的変数に格納されているかどうかは関係ありません。 –

答えて

3

以下に示すように、私は静的オブジェクトとしてWindowsフォームを定義しました:

ない、あなたのアプリケーションのメインウィンドウのフォームを保存したいと思います理由を確認してくださいパブリック静的フィールドとして。どのようなシナリオを考えていますか?あなたが見ることができるように

は、私が

これはC++ではありません...呼び出す前に、この静的なフォームの(新しいを使用して)メモリ空間を割り当てられました。 newを呼び出すことはC#では必須ですが、参照型についてはオプションではありません。

、フォームが閉じられた後(Disposeを使用して)メモリを解放しました。

Disposeを呼び出すと、管理対象メモリがまったく解放されません。私はあなたがIDisposableパターンとマネージメモリモデルを読むことをお勧めします、あなたはここでかなり誤解されているようです。

これらの非静的オブジェクトも廃棄する必要がありますか、formMain.Dispose();行が呼び出されますか?

静的でも非静的でもない場合は、すべての使い捨てオブジェクトを処分する必要があります。詳しくは

ためthisを読む私は(FormClosedまたはFormClosingイベントでのように、)のDisposeを使用することを好むすべきプログラムのどの段階で、これらの非静的オブジェクトを、処分する必要がある場合は?

IDisposableパターンのガイドラインに従って処分する必要があります。

+0

問題のプログラムについて。 ** FormMain()のようなメソッド内で定義されているいくつかのラベル** **(1)** ** FormMainクラスの本体内で定義されている他のいくつかのラベル私はそれらを他の形式とやりとりするために使うので、私は本体と 'public 'に定義します)。これまでは、メソッドで定義されたラベル(スコープがある)では、それらを処分する必要はありません。一方、フォームの本体内で公開されているラベルについては、(FormClosing'イベントで)フォームを閉じる直前にそれらを破棄する必要があります。私は正しい? – ssd

+0

@ssd no、no and no。 'IDisposable'パターンに従ってオブジェクトを破棄し、イベントを忘れる必要があります。また、メソッド内で作成しているラベルは、それらを任意の用途に使用したい場合は、フォームの 'Controls'コレクションに追加されている可能性があります。したがって、ローカル名が有効範囲外になったとしても、オブジェクトは引き続き到達可能です。私のアドバイス:フォーム、コントロール、イベントについては忘れてください。最初に基本を理解する必要があります。管理されたメモリモデルを読み、それを理解してから構築してください。あなたはクロール方法を知る前にスケートをしようとしているようです。 – InBetween

関連する問題