私は式ビルダーパターンを使用してオブジェクトを作成しています。式ビルダーがオブジェクト上で構成するものの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()
{
}
}
同じ種類の2つのオブジェクトはありますか? –
どの2つのオブジェクト?? – joniba
デリゲートは不変の参照型です。返される 'TargetObject'は、それを作成した' ObjectBuilder'インスタンスがGCされないようにしません。 'handler'フィールドは、ヒープ上のいくつかのデリゲートインスタンス*他の*への*参照*を保持します。このリファレンスは、 'target.SomeEvent + = handler;'を実行すると*コピーされます。つまり、 'target'はこの' ObjectBuilder'についての知識が全くなく、直接参照を保持しません。イベントハンドラの(おそらく)デリゲートフィールド。 – Ani