0

MVP デザイン パターンを使用して Windows フォーム アプリケーションを作成します。例:

IViewInterface view = new FormSome();
IPresenter presenter = new Presenter(view);

プレゼンター コンストラクターでは、次のようなことを行います。

public Presenter( IViewInterface view ) {
    this.view = view;

    this.view.someEvens += myMethod;
}

今私の質問:私がこのようなことをするとどうなりますか:

IViewInterface view;
{
    view = new FormSome();
    IPresenter presenter = new Presenter(view);
}
// if my presenter exists here? 

プレゼンターから明示的にメソッドを呼び出したくありません。プレゼンターがビューのイベントを処理したいだけです。GC はプレゼンターをメモリから削除しますか、それともプレゼンターがビュー イベントを処理することを GC が認識しているため、ビューが存在する限り、プレゼンターも存在しますか?

編集

私はそれをテストし、それは動作します。しかし、GC がまだプレゼンターを破棄していないため、それが機能するかどうかはわかりません。または、GC は私が思っていたよりもインテリジェントです。

4

1 に答える 1

2

プレゼンターは、ここで設定されたイベントを通じて参照されるため、「生きている」ままです。

this.view.someEvens += myMethod;

ビューが GC によって収集される場合、プレゼンターも破棄されます。

ただし、現時点ではプレゼンターへの言及がないことに注意してください。投稿したコードが切り取られた後は、もうアクセスできません。

編集
ちなみに、クラスのすべてのインスタンスを破棄したと思ったとき、これはたまたま問題になりましたが、誤ってそれらをイベントターゲットとして使用したため、それらはまだアクティブでした。処理されるべきではない TCP コマンドが処理されていました。

それが、あなたが求めていることが実際に当てはまると言える理由です:-)

于 2012-05-21T15:07:33.723 に答える