jno*_*cho 9 c# c++ java oop instance
注意:我最感兴趣的是C#,Java和C++,但这是任何语言都会提出的学术问题.
我知道这个问题是从外面可解,利用给定的语言的适当的方法(电话free,Dispose或通过删除所有引用实例).
我的想法是我创建了一个实例,在构造函数中,我启动了私有计时器.当计时器结束时,它将调用一些实例方法并销毁变量.
我认为在C#中应该可以在实现时调用Disposeself IDisposable,但这不会破坏实例.
在C++中,我可以调用它destructor,但这会导致内存泄漏,而且这是非常糟糕的做法.
在Java中我没有任何线索,分配this它是不可能的,因为它是final字段.
那么有什么办法可以摧毁自己吗?
你的问题非常有趣,我不知道在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构造函数中创建.
| 归档时间: |
|
| 查看次数: |
19313 次 |
| 最近记录: |