例如是否可以销毁/删除自己?

jno*_*cho 9 c# c++ java oop instance

注意:我最感兴趣的是C#,Java和C++,但这是任何语言都会提出的学术问题.

我知道这个问题是从外面可解,利用给定的语言的适当的方法(电话free,Dispose或通过删除所有引用实例).

我的想法是我创建了一个实例,在构造函数中,我启动了私有计时器.当计时器结束时,它将调用一些实例方法并销毁变量.

我认为在C#中应该可以在实现时调用Disposeself IDisposable,但这不会破坏实例.

在C++中,我可以调用它destructor,但这会导致内存泄漏,而且这是非常糟糕的做法.

在Java中我没有任何线索,分配this它是不可能的,因为它是final字段.

那么有什么办法可以摧毁自己吗?

Nik*_*vic 9

你的问题非常有趣,我不知道在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

为了测试这个,您可以在Form中设置一个按钮单击,如下所示,并在调试器中检查它:

Bar bar = null;
private void button2_Click(object sender, EventArgs e)
{
       if(bar==null)
             bar = new Bar();
}
Run Code Online (Sandbox Code Playgroud)

因此,下次单击该按钮时,您将能够看到该Bar实例仍然存在,但其中的Foo实例为null,尽管它已在Bar构造函数中创建.