gpt4 book ai didi

c# - 例如,是否有可能销毁/删除 self ?

转载 作者:可可西里 更新时间:2023-11-01 16:30:11 25 4
gpt4 key购买 nike

注意:我对 C#、Java 和 C++ 最感兴趣,但因为这是任何语言都会做的更具学术性的问题。

我知道这个问题可以从外部解决,方法是使用给定语言的适当方法(调用 freeDispose,或删除对实例的所有引用)。

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

我认为在 C# 中应该可以在实现 IDisposable 时调用自身的 Dispose,但这不会破坏实例。

在 C++ 中,我可以调用析构函数,但这会导致内存泄漏,而且这是非常糟糕的做法。

在 Java 中我不知道,分配给 this 是不可能的,因为它是 final 字段。

那么有什么方法可以 self 毁灭吗?

最佳答案

你的问题很有趣,我不知道在 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 的构造函数中。

关于c# - 例如,是否有可能销毁/删除 self ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17486608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com