2010-11-30 3 views
1

私は式ビルダーパターンを使用してオブジェクトを作成しています。式ビルダーがオブジェクト上で構成するものの1つは、イベントハンドラです。ここではいくつかの実証擬似コードは次のとおりです。私が望む何ある代理人から別の代理人への呼び出しリストのコピー

public class TargetObject 
    { 
     public event Action SomeEvent; 
    } 

    public class ObjectBuilder 
    { 
     private Action handler; 

     public TargetObject GetObject() 
     { 
      TargetObject target = new TargetObject(); 
      target.SomeEvent += handler; 

      return target; 
     } 

     public ObjectBuilder AddHandler(Action handler) 
     { 
      this.handler += handler; 
      return this; 
     } 
    } 

ではなく、書き込みよりも、次のとおりです。

this.handler += handler; 

」に、ObjectBuilderに「ハンドラ」メンバーによってカプセル化された呼び出しリストを転送するにはSomeEvent "をターゲットにします。それ以外の場合は、TargetObjectの "SomeEvent"がObjectBuilderの "ハンドラ"への参照を保持するため、ObjectBuilderはガベージコレクションされません。

これは可能ですか?

EDIT: 要求されたとして、ここではこれらのクラスを消費し、いくつかのサンプルコードは次のとおりです。

class Program 
    { 
     static void Main(string[] args) 
     { 
      TargetObject target = new ObjectBuilder() 
       .AddHandler(DoSomething) 
       .GetObject(); 
     } 

     private static void DoSomething() 
     { 
     } 
    } 
+0

同じ種類の2つのオブジェクトはありますか? –

+0

どの2つのオブジェクト?? – joniba

+0

デリゲートは不変の参照型です。返される 'TargetObject'は、それを作成した' ObjectBuilder'インスタンスがGCされないようにしません。 'handler'フィールドは、ヒープ上のいくつかのデリゲートインスタンス*他の*への*参照*を保持します。このリファレンスは、 'target.SomeEvent + = handler;'を実行すると*コピーされます。つまり、 'target'はこの' ObjectBuilder'についての知識が全くなく、直接参照を保持しません。イベントハンドラの(おそらく)デリゲートフィールド。 – Ani

答えて

0

あなたは対象物体のインスタンスは、その「ハンドラ」フィールドを保持しているので、ObjectBuilderはGC-EDではありませんか? delegateは不変ですが、this.handler + = handlerは新しいActionインスタンスを作成します。

+0

Aniさんのコメントへの私の最後のコメントをご覧ください。新しいデリゲートインスタンスが作成されるのは間違いありませんが、この新しいインスタンスはObjectBuilderインスタンスのメンバを参照します。 – joniba

+0

@ joniba:テストアプリを書いていて、メモリプロファイラを使用してリークを見つけることができませんでした。 –

関連する問題