あなたの質問は非常に興味深いものです.C#でそうする他の方法は知りませんが、インスタンスの内側から強制的に外側から破壊する方法はありません. それで、これが可能かどうかを確認するために私が思いついたものです。Foo
タイマーの特定の間隔が経過したときに発生するイベントを持つクラスを作成できます。イベント内でそのイベント ( Bar
) に登録されているクラスは、イベントを登録解除し、インスタンスの参照を に設定しますnull
。これは私がそれを行う方法であり、テストされ、機能します。
public class Foo
{
public delegate void SelfDestroyer(object sender, EventArgs ea);
public event SelfDestroyer DestroyMe;
Timer t;
public Foo()
{
t = new Timer();
t.Interval = 2000;
t.Tick += t_Tick;
t.Start();
}
void t_Tick(object sender, EventArgs e)
{
OnDestroyMe();
}
public void OnDestroyMe()
{
SelfDestroyer temp = DestroyMe;
if (temp != null)
{
temp(this, new EventArgs());
}
}
}
public class Bar
{
Foo foo;
public Bar()
{
foo = new Foo();
foo.DestroyMe += foo_DestroyMe;
}
void foo_DestroyMe(object sender, EventArgs ea)
{
foo.DestroyMe -= foo_DestroyMe;
foo = null;
}
}
これをテストするには、次のようにフォーム内でボタンのクリックを設定し、デバッガーで確認します。
Bar bar = null;
private void button2_Click(object sender, EventArgs e)
{
if(bar==null)
bar = new Bar();
}
そのため、次にボタンをクリックすると、Bar
インスタンスがまだ存在していることがわかりますが、そのインスタンスはのコンストラクターFoo
内で作成されていますが、その中のインスタンスは nullです。Bar